1 -- Writeup at https://work.njae.me.uk/2023/12/09/advent-of-code-2023-day-09/
5 import Prelude hiding (seq)
7 type Sequence = [[Int]]
11 do dataFileName <- getDataFileName
12 text <- readFile dataFileName
13 let histories = readInput text
15 let seqs = fmap expand histories
17 -- let seqs' = fmap extend seqs
20 let rseqs = fmap (expand . reverse) histories
23 part1 :: [Sequence] -> Int
24 part1 = sum . fmap (evaluate . extend)
27 readInput :: String -> [[Int]]
28 readInput = fmap (fmap read . words) . lines
30 expand :: [Int] -> Sequence
31 expand seq = unfoldr go seq
33 | all (== 0) xs = Nothing
34 | otherwise = Just (xs, differences xs)
36 differences :: [Int] -> [Int]
37 differences xs = zipWith (-) (tail xs) xs
39 extend :: Sequence -> Sequence
40 extend = fst . foldr extendRow ([], 0)
42 extendRow :: [Int] -> ([[Int]], Int) -> ([[Int]], Int)
43 extendRow row (seq, n) = ((row ++ [n']) : seq, n')
44 where n' = last row + n
46 evaluate :: Sequence -> Int
47 evaluate = last . head