Advent of Code solutions
at main 26 lines 713 B view raw
1import Data.Function 2import Data.List 3import Data.Maybe 4import Text.Parsec 5 6int :: Parsec String u Int 7int = read <$> many1 digit 8 9parseBuses = ((Just <$> int) <|> (char 'x' >> return Nothing)) `sepBy` char ',' 10 11answer :: [Maybe Int] -> Int 12answer buses = answer_ offset distance $ tail toFind 13 where 14 toFind = catMaybes $ zipWith (\i b -> (i,) <$> b) [0 :: Int ..] buses 15 (offset, distance) = head toFind 16 17 answer_ n m [] = m - n 18 answer_ n d all@((i, m) : rest) 19 | n `mod` m == i `mod` m = answer_ n (d * m) rest 20 | otherwise = answer_ (n + d) d all 21 22main :: IO () 23main = do 24 [_, busstr] <- lines <$> getContents 25 let Right buses = parse parseBuses "" busstr 26 in print $ answer buses