diff options
-rw-r--r-- | 2024/11.hs | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/2024/11.hs b/2024/11.hs new file mode 100644 index 0000000..1191d17 --- /dev/null +++ b/2024/11.hs @@ -0,0 +1,27 @@ +import qualified Data.Map.Strict as Map + +main :: IO () +main = do + s0 <- map (read @Int) . words <$> getContents + let ndigs10 0 = 1 + ndigs10 n = pre (4::Int) + where pre p | n >= 10 ^ p = pre (2*p) + | otherwise = bin 0 p + bin lo hi | lo == hi - 1 = hi + | n >= 10 ^ mid = bin mid hi + | otherwise = bin lo mid + where mid = (lo + hi) `quot` 2 + let splitHalf n = + let nd = ndigs10 n + in if even nd then Just $ n `quotRem` (10 ^ (ndigs10 n `quot` 2)) + else Nothing + let blink = + Map.fromListWith (+) + . concatMap (\(n, c) -> + if n == 0 then [(1, c)] + else case splitHalf n of + Just (n1, n2) -> [(n1, c), (n2, c)] + Nothing -> [(n * 2024, c)]) + . Map.assocs + print $ sum . Map.elems $ iterate blink (Map.fromList (map (,1::Int) s0)) !! 25 + print $ sum . Map.elems $ iterate blink (Map.fromList (map (,1) s0)) !! 75 |