X-Git-Url: https://git.njae.me.uk/?a=blobdiff_plain;f=advent09%2FMain.hs;fp=advent09%2FMain.hs;h=9352f5de9256d523f9aca4fc9944a3b9f6185e6e;hb=2459965153387b33710844ede8083651751dc087;hp=0000000000000000000000000000000000000000;hpb=2112fa6fd0099dabee1c0ed9890ee3a381fbc03c;p=advent-of-code-23.git diff --git a/advent09/Main.hs b/advent09/Main.hs new file mode 100644 index 0000000..9352f5d --- /dev/null +++ b/advent09/Main.hs @@ -0,0 +1,45 @@ +-- Writeup at https://work.njae.me.uk/2023/12/09/advent-of-code-2023-day-09/ + +import AoC +import Data.List + +newtype Sequence = Sequence [[Int]] deriving (Show, Eq) + +main :: IO () +main = + do dataFileName <- getDataFileName + text <- readFile dataFileName + let histories = readInput text + -- print histories + let seqs = fmap (expand . Sequence . pure) histories + -- print seqs + -- let seqs' = fmap extend seqs + -- print seqs' + print $ part1 seqs + let rseqs = fmap (expand . Sequence . pure . reverse) histories + print $ part1 rseqs + +part1 :: [Sequence] -> Int +part1 = sum . fmap (evaluate . extend) + + +readInput :: String -> [[Int]] +readInput = fmap (fmap read . words) . lines + +expand :: Sequence -> Sequence +expand (Sequence xss) + | all (== 0) $ last xss = Sequence xss + | otherwise = expand $ Sequence $ xss ++ [differences $ last xss] + +differences :: [Int] -> [Int] +differences xs = zipWith (-) (tail xs) xs + +extend :: Sequence -> Sequence +extend (Sequence xss) = Sequence $ fst $ foldr extendRow ([], 0) xss + +extendRow :: [Int] -> ([[Int]], Int) -> ([[Int]], Int) +extendRow row (seq, n) = ((row ++ [n']) : seq, n') + where n' = last row + n + +evaluate :: Sequence -> Int +evaluate (Sequence xss) = last $ head xss