30
									
								
								src/Day11.hs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								src/Day11.hs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,30 @@
 | 
			
		||||
module Main where
 | 
			
		||||
 | 
			
		||||
import qualified Data.IntMap as IM
 | 
			
		||||
 | 
			
		||||
blink :: Int -> [Int]
 | 
			
		||||
blink 0 = [1]
 | 
			
		||||
blink x
 | 
			
		||||
  | (l, 0) <- len x `quotRem` 2,
 | 
			
		||||
    (a, b) <- x `quotRem` (10 ^ l) =
 | 
			
		||||
      [a, b]
 | 
			
		||||
  | otherwise = [x * 2024]
 | 
			
		||||
  where
 | 
			
		||||
    len :: Int -> Int
 | 
			
		||||
    len 0 = 0
 | 
			
		||||
    len a = 1 + len (a `div` 10)
 | 
			
		||||
 | 
			
		||||
blinkAll :: IM.IntMap Int -> IM.IntMap Int
 | 
			
		||||
blinkAll xs = IM.fromListWith (+) [(x', c) | (x, c) <- IM.toList xs, x' <- blink x]
 | 
			
		||||
 | 
			
		||||
blinkN :: Int -> IM.IntMap Int -> Int
 | 
			
		||||
blinkN n = IM.foldr (+) 0 . (!! n) . iterate blinkAll
 | 
			
		||||
 | 
			
		||||
main :: IO ()
 | 
			
		||||
main =
 | 
			
		||||
  do
 | 
			
		||||
    raw <- map read . words <$> readFile "./inputs/day11.in"
 | 
			
		||||
    let counts = IM.fromListWith (+) $ map (,1) raw
 | 
			
		||||
 | 
			
		||||
    putStr "Part 1: " >> print (blinkN 25 counts)
 | 
			
		||||
    putStr "Part 2: " >> print (blinkN 75 counts)
 | 
			
		||||
		Reference in New Issue
	
	Block a user