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"