diff --git a/aoc2025/Day3.newt b/aoc2025/Day3.newt new file mode 100644 index 0000000..a3e6a54 --- /dev/null +++ b/aoc2025/Day3.newt @@ -0,0 +1,52 @@ +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" diff --git a/aoc2025/day3/eg.txt b/aoc2025/day3/eg.txt new file mode 100644 index 0000000..7255fca --- /dev/null +++ b/aoc2025/day3/eg.txt @@ -0,0 +1,4 @@ +987654321111111 +811111111111119 +234234234234278 +818181911112111