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