Files
newt/aoc2025/Day7.newt
2025-12-06 22:32:44 -08:00

74 lines
2.3 KiB
Agda
Raw Permalink 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 Day7
import Prelude
import Node
import Aoc
import Data.SortedMap
import Monad.State
gridPoints : String List (Char × Int × Int)
gridPoints text = go 0 0 (unpack text) Nil
where
go : Int Int List Char List (Char × Int × Int) List (Char × Int × Int)
go row col Nil points = points
go row col ('\n' :: cs) points = go (row + 1) 0 cs points
go row col (c :: cs) points = go row (col + 1) cs ((c,row,col) :: points)
Grid : U
Grid = SortedMap Point Int
getGrid : String Grid
getGrid text = foldl update (EmptyMap compare) $ gridPoints text
where
update : Grid Char × Point Grid
update grid (c,pt) = updateMap pt (ord c) grid
process : Int Grid Int × Int
process rows g =
let grid' = foldl update (EmptyMap compare) $ toList g
part1 = foldl _+_ 0 $ map (isSplit grid') $ toList g
part2 = foldl _+_ 0 $ map isLast $ toList grid'
in (part1, part2)
where
isSplit : Grid (Point × Int) Int
isSplit grid ((r,c), 94) = case lookupMap' (r - 1,c) grid of
Just n => if n > 0 then 1 else 0
_ => 0
isSplit grid _ = 0
isLast : (Point × Int) Int
isLast ((r,c),n) = if r + 1 == rows then n else 0
addStates : Point Int Grid Grid
addStates pt n g = let prev = fromMaybe 0 $ lookupMap' pt g
in updateMap pt (n + prev) g
update : Grid (Point × Int) Grid
update counts ((0,c),83) = addStates (1,c) ( 1) counts
update counts ((0,c),_) = counts
update counts ((r,c),46) = case lookupMap' (r - 1,c) counts of
Just 0 => counts
Just n => addStates (r,c) ( n) counts
_ => counts
update counts ((r,c),94) = case lookupMap' (r - 1,c) counts of
Just n => addStates (r,c - 1) (n) $ addStates (r,c + 1) n counts
_ => counts
update counts ((r,c),_) = counts
run : String -> IO Unit
run fn = do
putStrLn fn
text <- readFile fn
let grid = getGrid text
let rows = trace "rows" $ foldl max 0 $ map (fst fst) $ toList grid
let cols = trace "cols" $ foldl max 0 $ map (snd fst) $ toList grid
let (part1, part2) = process rows grid
putStrLn $ "part1 \{show part1}"
putStrLn $ "part2 \{show part2}"
main : IO Unit
main = do
run "aoc2025/day7/eg.txt"
run "aoc2025/day7/input.txt"