diff --git a/hs/src/Aoc/Y2020.hs b/hs/src/Aoc/Y2020.hs index fbac06b..94c1f72 100644 --- a/hs/src/Aoc/Y2020.hs +++ b/hs/src/Aoc/Y2020.hs @@ -15,6 +15,7 @@ import qualified Aoc.Y2020.D09 as D09 import qualified Aoc.Y2020.D10 as D10 import qualified Aoc.Y2020.D11 as D11 import qualified Aoc.Y2020.D12 as D12 +import qualified Aoc.Y2020.D13 as D13 year :: Year year = Year 2020 @@ -30,4 +31,5 @@ year = Year 2020 , (10, D10.day) , (11, D11.day) , (12, D12.day) + , (13, D13.day) ] diff --git a/hs/src/Aoc/Y2020/D13.hs b/hs/src/Aoc/Y2020/D13.hs new file mode 100644 index 0000000..caf7bae --- /dev/null +++ b/hs/src/Aoc/Y2020/D13.hs @@ -0,0 +1,29 @@ +module Aoc.Y2020.D13 + ( day + ) where + +import Control.Monad +import Data.Function +import Data.List +import Data.Maybe + +import Aoc.Day +import Aoc.Parse + +parser :: Parser (Int, [Int]) +parser = do + earliest <- decimal + void newline + buses <- sepBy ((Just <$> decimal) <|> (Nothing <$ char 'x')) (char ',') + void newline + pure (earliest, catMaybes buses) + +solver :: (Int, [Int]) -> IO () +solver (earliest, buses) = do + putStrLn ">> Part 1" + let busTimes = [(bus, earliest - mod earliest bus + bus) | bus <- buses] + (nextBus, nextBusTime) = minimumBy (compare `on` snd) busTimes + print $ nextBus * (nextBusTime - earliest) + +day :: Day +day = dayParse parser solver