From e810337cf257c5ac6ecce01eb58017ac7164a113 Mon Sep 17 00:00:00 2001 From: Steve Dunham Date: Thu, 4 Dec 2025 22:51:58 -0800 Subject: [PATCH] Day 5 --- aoc2025/Day5.newt | 64 +++++++++++++++++++++++++++++++++++++++++++++ aoc2025/day5/eg.txt | 11 ++++++++ 2 files changed, 75 insertions(+) create mode 100644 aoc2025/Day5.newt create mode 100644 aoc2025/day5/eg.txt diff --git a/aoc2025/Day5.newt b/aoc2025/Day5.newt new file mode 100644 index 0000000..e490816 --- /dev/null +++ b/aoc2025/Day5.newt @@ -0,0 +1,64 @@ +module Day5 + +import Prelude +import Node +import Aoc + +Range : U +Range = Int × Int + +record Problem where + constructor MkP + pairs : List Range + avail : List Int + + +parse : String → Either String Problem +parse text = do + + let (a :: b :: Nil) = split (trim text) "\n\n" + | cs => Left "got \{show $ length cs} chunks" + pairs <- traverse parsePair $ split a "\n" + let avail = map stringToInt $ split b "\n" + Right $ MkP pairs avail + where + parsePair : String → Either String Range + parsePair s = do + let (a :: b :: Nil) = map stringToInt $ split s "-" + | _ => Left "not a pair '\{show s}'" + Right (a,b) + +part1 : Problem → Int +part1 prob = length' $ filter (isFresh prob.pairs) prob.avail + where + isFresh : List Range → Int → Bool + isFresh ((a,b) :: pairs) v = if a <= v && v <= b then True else isFresh pairs v + isFresh Nil v = False + +max : ∀ a. {{Ord a}} → a → a → a +max a b = if a < b then b else a + +part2 : List Range → Int +part2 pairs = foldl _+_ 0 $ map size $ merge $ qsort (\a b => a < b) pairs + where + size : Range → Int + size (a,b) = b - a + 1 + + merge : List Range → List Range + merge ((s,e) :: (s', e') :: xs) = + if e < s' then (s,e) :: merge ((s', e') :: xs) + else merge ((s, max e e') :: xs) + merge xs = xs + +run : String -> IO Unit +run fn = do + putStrLn fn + text <- readFile fn + let (Right prob) = parse text | Left msg => putStrLn msg + putStrLn $ "part1 " ++ show (part1 prob) + putStrLn $ "part2 " ++ show (part2 prob.pairs) + +main : IO Unit +main = do + run "aoc2025/day5/eg.txt" + run "aoc2025/day5/input.txt" diff --git a/aoc2025/day5/eg.txt b/aoc2025/day5/eg.txt new file mode 100644 index 0000000..2e9078d --- /dev/null +++ b/aoc2025/day5/eg.txt @@ -0,0 +1,11 @@ +3-5 +10-14 +16-20 +12-18 + +1 +5 +8 +11 +17 +32