Files
newt/aoc2024/Day11.newt

50 lines
1.4 KiB
Agda
Raw Blame History

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))
}`
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"