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