From ebfa5b0f6bf0342d4e7c88132dbd3a1627c2551a Mon Sep 17 00:00:00 2001
From: Daniele Fucini <dfucini@gmail.com>
Date: Thu, 12 Dec 2024 09:34:37 +0100
Subject: [PATCH] Day 11, Part 2 + improved Part 1

---
 Day11/puzzle1.hs | 26 ++++++++++++++------------
 Day11/puzzle2.hs | 17 +++++++++++++++++
 2 files changed, 31 insertions(+), 12 deletions(-)
 create mode 100644 Day11/puzzle2.hs

diff --git a/Day11/puzzle1.hs b/Day11/puzzle1.hs
index 3d17146..2df7bbc 100644
--- a/Day11/puzzle1.hs
+++ b/Day11/puzzle1.hs
@@ -1,15 +1,17 @@
-blinkStone :: Int -> [Int]
-blinkStone 0 = [1]
-blinkStone s = let ss = show s
-                   nDigit = length ss
-               in  if even nDigit
-                      then map read [take (nDigit `div` 2) ss, drop (nDigit `div` 2) ss]
-                   else [s * 2024]
+import qualified Data.Map.Strict as M
 
-blink :: Int -> [Int] -> [Int]
-blink 0 xs = xs
-blink n xs = blink (n - 1) $ concatMap blinkStone xs
+blinkStone :: (Int, Int) -> [(Int, Int)]
+blinkStone (0, n) = [(1, n)]
+blinkStone (s, n) = let ss = show s
+                        nDigit = length ss
+                    in  if even nDigit
+                            then zip (map read [take (nDigit `div` 2) ss, drop (nDigit `div` 2) ss]) [n, n]
+                        else [(s * 2024, n)]
+
+blink :: Int -> M.Map Int Int -> M.Map Int Int
+blink 0 m = m
+blink n m = blink (n - 1) $ M.fromListWith (+) $ concatMap blinkStone $ M.toList m
 
 main = do
-    contents <- words <$> readFile "day11.txt"
-    print . length . blink 25 $ map read contents 
+    contents <- M.fromListWith (+) . flip zip (repeat 1) . map read . words <$> readFile "day11.txt"
+    print . M.foldl (+) 0 $ blink 25 contents 
diff --git a/Day11/puzzle2.hs b/Day11/puzzle2.hs
new file mode 100644
index 0000000..5bb51f4
--- /dev/null
+++ b/Day11/puzzle2.hs
@@ -0,0 +1,17 @@
+import qualified Data.Map.Strict as M
+
+blinkStone :: (Int, Int) -> [(Int, Int)]
+blinkStone (0, n) = [(1, n)]
+blinkStone (s, n) = let ss = show s
+                        nDigit = length ss
+                    in  if even nDigit
+                            then zip (map read [take (nDigit `div` 2) ss, drop (nDigit `div` 2) ss]) [n, n]
+                        else [(s * 2024, n)]
+
+blink :: Int -> M.Map Int Int -> M.Map Int Int
+blink 0 m = m
+blink n m = blink (n - 1) $ M.fromListWith (+) $ concatMap blinkStone $ M.toList m
+
+main = do
+    contents <- M.fromListWith (+) . flip zip (repeat 1) . map read . words <$> readFile "day11.txt"
+    print . M.foldl (+) 0 $ blink 75 contents