import Data.List main :: IO () main = do input <- readFile "input" let stones = map readInt . words . init $ input -- print $ part1 stones print $ part2 stones ---- part2 ns = let nns = map (\n -> (1,n)) ns x = (iterate blinkC nns)!!75 in sum $ map fst x blinkC ns = compress $ sortOn snd $ concatMap blinkC1 ns blinkC1 (n,m) = map (\k -> (n,k)) (blink1 m) compress :: Eq a => [(Int,a)] -> [(Int,a)] compress [] = [] compress [x] = [x] compress ((n1,m1):(n2,m2):rest) | m1 == m2 = compress ((n1+n2,m1):rest) | otherwise = (n1,m1):(compress ((n2,m2):rest)) ---- part1 ns = length $ (iterate blink ns)!!25 blink ns = concatMap blink1 ns blink1 0 = [1] blink1 n = let s = show n l = length s in if even l then map readInt $ pairToList $ splitAt (l `div` 2) s else [n*2024] pairToList (a,b) = [a,b] readInt :: String -> Integer readInt = read