From 0e498f3caaca3ec8df87c3e8069e12f50b92209f Mon Sep 17 00:00:00 2001 From: Martin Potier Date: Mon, 14 Dec 2020 14:53:53 +0200 Subject: [PATCH] Part 1 --- day13/main.hs | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/day13/main.hs b/day13/main.hs index 1d83671..143b932 100755 --- a/day13/main.hs +++ b/day13/main.hs @@ -5,7 +5,7 @@ {-# OPTIONS_GHC -Wall -Wincomplete-uni-patterns #-} {-# OPTIONS_GHC -Wno-unused-top-binds -Wno-unused-imports #-} -{-# OPTIONS_GHC -Wno-unused-matches #-} +{-# OPTIONS_GHC -Wno-unused-matches -Wno-type-defaults #-} {-# LANGUAGE OverloadedStrings #-} import Control.Applicative @@ -13,27 +13,41 @@ import Data.Attoparsec.Text (Parser) import Data.Text (Text) import Debug.Trace (trace) import Text.Pretty.Simple +import Data.Maybe (fromMaybe,catMaybes) +import Data.List (find,sortOn) import qualified Data.Attoparsec.Text as A import qualified Data.Text as T exampleData :: String exampleData = "939\n7,13,x,x,59,x,31,19" -numOrXParser :: Parser Text -numOrXParser = A.takeWhile (/= ',') +numOrXParser :: Parser (Maybe Int) +numOrXParser = (Just <$> A.decimal) <|> ("x" *> pure Nothing) inputParser :: Parser (Int,[Int]) inputParser = do n <- A.decimal A.skipSpace xs <- numOrXParser `A.sepBy` "," - pure (n,read <$> T.filter (/= ',') xs) + pure (n,catMaybes $ xs) parseInput :: String -> Either String (Int,[Int]) parseInput = (A.parseOnly inputParser) . T.pack +solvePart1 :: String -> Either String Int +solvePart1 str = do + (n,xs) <- parseInput str + let (bus, time) = head + $ sortOn (snd) + $ map (\x -> (x,fromMaybe (-1) $ find (> n) [0,x..])) xs + pure $ bus * (time - n) + main :: IO () main = do putStrLn ":: Test" - A.parseTest inputParser $ T.pack exampleData + pPrint $ A.parseOnly inputParser $ T.pack exampleData + pPrint $ take 3 ((\n -> [1,n..]) 59) putStrLn ":: Day 13 - Part 1" + input <- readFile "day13/input" + pPrint $ solvePart1 exampleData + pPrint $ solvePart1 input