Advent of Code solutions
1import Data.List
2import Data.Ord
3
4split :: Eq a => a -> [a] -> [[a]]
5split x ys = splitInner x [] ys
6 where
7 splitInner _ [] [] = []
8 splitInner _ r [] = [reverse r]
9 splitInner x r (y : ys)
10 | x == y = reverse r : splitInner x [] ys
11 | otherwise = splitInner x (y : r) ys
12
13main :: IO ()
14main = do
15 [arrival, buses] <- lines <$> getContents
16 let
17 start = read arrival
18 intervals = [read n | n <- split ',' buses, n /= "x"] :: [Int]
19 waits = [(n, n - start `mod` n) | n <- intervals]
20 in print . uncurry (*) $ minimumBy (comparing snd) waits