|
- main :: IO ()
- main = do
- raw <- readFile "day9.txt"
- let nums = (map read $ lines raw) :: [Int]
- ansA = solveA nums
- ansB = solveB ansA nums
- in do
- putStrLn $ "day9a: " ++ (show ansA)
- putStrLn $ "day9b: " ++ (show ansB)
-
- solveA :: [Int] -> Int
- solveA nums = runWindow' (take 25 nums) (drop 25 nums)
-
- solveB :: Int -> [Int] -> Int
- solveB t nums = (maximum ans) + (minimum ans)
- where
- ans = testRuns t nums
-
- runWindow' :: [Int] -> [Int] -> Int
- runWindow' _ [] = error "reached end of stream"
- runWindow' win (n:ns) =
- if n `elem` ws
- then runWindow' ((tail win) ++ [n]) ns
- else n
- where
- ws = [ x+y | x <- ls, y <- ls, x /= y ]
- ls = filter (<= (n - (minimum win))) win
-
- findRun :: Int -> [Int] -> Int -> [Int] -> Maybe [Int]
- findRun _ _ _ [] = Nothing
- findRun t a r (l:ls)
- | r + l == t = Just (l:a)
- | r + l > t = Nothing
- | otherwise = findRun t (l:a) (r + l) ls
-
- testRuns :: Int -> [Int] -> [Int]
- testRuns _ [] = error "no answer"
- testRuns t ls = case (findRun t [] 0 ls) of
- Nothing -> testRuns t (tail ls)
- Just x -> x
|