Simplified day 9
[advent-of-code-23.git] / advent09 / Main.hs
index 9352f5de9256d523f9aca4fc9944a3b9f6185e6e..b232293e93b10a5c6971ed1ec91e69ebf184c940 100644 (file)
@@ -2,8 +2,9 @@
 
 import AoC
 import Data.List
+import Prelude hiding (seq)
 
-newtype Sequence = Sequence [[Int]] deriving (Show, Eq)
+type Sequence = [[Int]] 
 
 main :: IO ()
 main = 
@@ -11,12 +12,12 @@ main =
       text <- readFile dataFileName
       let histories = readInput text
       -- print histories
-      let seqs = fmap (expand . Sequence . pure) histories
+      let seqs = fmap expand histories
       -- print seqs
       -- let seqs' = fmap extend seqs
       -- print seqs'
       print $ part1 seqs
-      let rseqs = fmap (expand . Sequence . pure . reverse) histories
+      let rseqs = fmap (expand . reverse) histories
       print $ part1 rseqs
 
 part1 :: [Sequence] -> Int
@@ -26,20 +27,21 @@ 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]
+expand :: [Int] -> Sequence
+expand seq = unfoldr go seq
+  where go xs
+          | all (== 0) xs = Nothing
+          | otherwise = Just (xs, differences xs)
 
 differences :: [Int] -> [Int]
 differences xs = zipWith (-) (tail xs) xs
 
 extend :: Sequence -> Sequence
-extend (Sequence xss) = Sequence $ fst $ foldr extendRow ([], 0) xss
+extend = fst . foldr extendRow ([], 0)
 
 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
+evaluate = last . head