53 lines
1.4 KiB
Agda
53 lines
1.4 KiB
Agda
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"
|