@@ -11,6 +11,7 @@ common common
|
|||||||
default-extensions:
|
default-extensions:
|
||||||
LambdaCase
|
LambdaCase
|
||||||
ViewPatterns
|
ViewPatterns
|
||||||
|
TupleSections
|
||||||
|
|
||||||
build-depends:
|
build-depends:
|
||||||
, base >=4.14 && <5
|
, base >=4.14 && <5
|
||||||
@@ -89,3 +90,9 @@ executable day10
|
|||||||
hs-source-dirs: src
|
hs-source-dirs: src
|
||||||
main-is: Day10.hs
|
main-is: Day10.hs
|
||||||
build-depends: containers
|
build-depends: containers
|
||||||
|
|
||||||
|
executable day11
|
||||||
|
import: common
|
||||||
|
hs-source-dirs: src
|
||||||
|
main-is: Day11.hs
|
||||||
|
build-depends: containers
|
||||||
|
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