Simplified day 9
authorNeil Smith <NeilNjae@users.noreply.github.com>
Mon, 11 Dec 2023 19:52:04 +0000 (19:52 +0000)
committerNeil Smith <NeilNjae@users.noreply.github.com>
Mon, 11 Dec 2023 19:52:04 +0000 (19:52 +0000)
advent-of-code23.cabal
advent09/Main.hs
advent09/MainComplicated.hs [new file with mode: 0644]

index 7b07a89b5c642d02661d7e8db116c6d848e98bc7..10fd7c42db5da62dbbf102551a4eea65d63a3a6f 100644 (file)
@@ -154,6 +154,9 @@ executable advent08
 executable advent09
   import: common-extensions, build-directives
   main-is: advent09/Main.hs
+executable advent09c
+  import: common-extensions, build-directives
+  main-is: advent09/MainComplicated.hs
 
 executable advent10
   import: common-extensions, build-directives
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
diff --git a/advent09/MainComplicated.hs b/advent09/MainComplicated.hs
new file mode 100644 (file)
index 0000000..9352f5d
--- /dev/null
@@ -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