module Day3 import Prelude import Node parse : String → List (List Int) parse text = map mkbank $ split (trim text) "\n" where mkbank : String → List Int mkbank line = map (\c => ord c - 48) $ unpack line part1 : List (List Int) → Int part1 banks = foldl _+_ 0 $ map (max 0 0) banks where max : Int → Int → List Int → Int max a b Nil = a * 10 + b max a b (c :: Nil) = if c > b then max a c Nil else max a b Nil max a b (c :: cs) = if c > a then max c 0 cs else if c > b then max a c cs else max a b cs twelve : Nat twelve = cast 12 part2 : List (List Int) → Int part2 banks = foldl _+_ 0 $ map go banks where calc : Int → List Int → Int calc acc Nil = acc calc acc (x :: xs) = calc (10 * acc + x) xs try : List Int → Int → List Int try (a :: b :: cs) n = if a < b then b :: cs ++ (n :: Nil) else a :: try (b :: cs) n try (a :: Nil) n = if a < n then n :: Nil else a :: Nil try Nil n = Nil go : List Int → Int go xs = let cand = take twelve xs rest = drop twelve xs in calc 0 $ foldl try cand rest run : String -> IO Unit run fn = do putStrLn fn text <- readFile fn let banks = parse text putStrLn $ "part1 " ++ show (part1 banks) putStrLn $ "part2 " ++ show (part2 banks) main : IO Unit main = do run "aoc2025/day3/eg.txt" run "aoc2025/day3/input.txt"