1 -- Writeup at https://work.njae.me.uk/2023/12/09/advent-of-code-2023-day-09/
6 newtype Sequence = Sequence [[Int]] deriving (Show, Eq)
10 do dataFileName <- getDataFileName
11 text <- readFile dataFileName
12 let histories = readInput text
14 let seqs = fmap (expand . Sequence . pure) histories
16 -- let seqs' = fmap extend seqs
19 let rseqs = fmap (expand . Sequence . pure . reverse) histories
22 part1 :: [Sequence] -> Int
23 part1 = sum . fmap (evaluate . extend)
26 readInput :: String -> [[Int]]
27 readInput = fmap (fmap read . words) . lines
29 expand :: Sequence -> Sequence
31 | all (== 0) $ last xss = Sequence xss
32 | otherwise = expand $ Sequence $ xss ++ [differences $ last xss]
34 differences :: [Int] -> [Int]
35 differences xs = zipWith (-) (tail xs) xs
37 extend :: Sequence -> Sequence
38 extend (Sequence xss) = Sequence $ fst $ foldr extendRow ([], 0) xss
40 extendRow :: [Int] -> ([[Int]], Int) -> ([[Int]], Int)
41 extendRow row (seq, n) = ((row ++ [n']) : seq, n')
42 where n' = last row + n
44 evaluate :: Sequence -> Int
45 evaluate (Sequence xss) = last $ head xss