diff --git a/aoc2024.cabal b/aoc2024.cabal index 43d691d..4965aeb 100644 --- a/aoc2024.cabal +++ b/aoc2024.cabal @@ -31,6 +31,7 @@ library Data.Point Day1 Day10 + Day11 Day2 Day3 Day4 diff --git a/input/day11.txt b/input/day11.txt new file mode 100644 index 0000000..41a9fbb --- /dev/null +++ b/input/day11.txt @@ -0,0 +1 @@ +2 72 8949 0 981038 86311 246 7636740 diff --git a/src/Day11.hs b/src/Day11.hs new file mode 100644 index 0000000..eaefc5d --- /dev/null +++ b/src/Day11.hs @@ -0,0 +1,33 @@ +module Day11 (partOne, partTwo, nextStone) where + +type Stone = Int + +partOne :: String -> Int +partOne raw = sum $ map (blinkN 25) $ parseStones raw + +partTwo :: String -> Int +partTwo raw = sum $ map (blinkN 75) $ parseStones raw + +blinkN :: Int -> Stone -> Int +blinkN 0 _ = 1 +blinkN blinks stone = sum $ map (blinkN (blinks - 1)) $ nextStone stone + +-- blinkN blinks stone = concatMap (blinkN (blinks - 1)) (nextStone stone) + +nextStone :: Stone -> [Stone] +nextStone stone + | stone == 0 = [1] + | even lengthDigits = + [ read $ take (lengthDigits `div` 2) digits, + read $ drop (lengthDigits `div` 2) digits + ] + | otherwise = [stone * 2024] + where + digits :: [Char] + digits = show stone + + lengthDigits :: Int + lengthDigits = length digits + +parseStones :: String -> [Stone] +parseStones = map read . words