Files
newt/aoc2024/Day11.newt

56 lines
1.7 KiB
Agda
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
module Day11
import Prelude
import Node
import Aoc
import SortedMap
infixl 7 _%_
pfunc _%_ : Int Int Int := `(x,y) => x % y`
-- should have a few more foreign functions and do this in newt
pfunc divide uses (_,_) : String String × String := `(s) => {
let l = s.length/2|0
return _$2C_(undefined, undefined, s.slice(0,l), s.slice(l))
}`
foldMap : a b. {{Ord a}} {{Eq a}} (b b b) SortedMap a b List (a × b) SortedMap a b
foldMap f m Nil = m
foldMap f m ((a,b) :: xs) = case lookupMap a m of
Nothing => foldMap f (updateMap a b m) xs
Just (_, b') => foldMap f (updateMap a (f b' b) m) xs
step : List (Int × Int) List (Int × Int)
step = go Nil
where
go : List (Int × Int) List (Int × Int) List (Int × Int)
go acc Nil = acc
go acc ((0,c) :: xs) = go ((1,c) :: acc) xs
go acc ((x,c) :: xs) =
let str = show x in
if slen str % 2 == 0
then let (a,b) = divide str in go ((stringToInt a,c) :: (stringToInt b,c) :: acc) xs
else go ((2024 * x,c) :: acc) xs
iter : Int SortedMap Int Int Int
iter count parts = let x = go count parts in foldl _+_ 0 $ map snd $ toList x
where
go : Int SortedMap Int Int SortedMap Int Int
go 0 stuff = stuff
go x stuff = go (x - 1) $ foldMap _+_ EmptyMap $ step $ toList stuff
run : String -> IO Unit
run fn = do
putStrLn fn
text <- readFile fn
let stuff = foldMap _+_ EmptyMap $ map (\ x => (stringToInt x, 1)) $ split (trim text) " "
let p1 = iter 25 stuff
putStrLn $ "part1 " ++ show p1
let p2 = iter 75 stuff
putStrLn $ "part2 " ++ show p2
main : IO Unit
main = do
run "aoc2024/day11/eg.txt"
run "aoc2024/day11/input.txt"