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