Advent of Code solutions
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