From 46755cea349a63a5b837229008ba7a8ea351fd38 Mon Sep 17 00:00:00 2001 From: Matthew Gretton-Dann Date: Thu, 12 Dec 2024 08:58:13 +0000 Subject: [PATCH] 2024 day 12 part 1. --- bin/day2412.ml | 35 +++++++++++++++++++++++++++++++++++ bin/dune | 6 ++++-- 2 files changed, 39 insertions(+), 2 deletions(-) create mode 100644 bin/day2412.ml diff --git a/bin/day2412.ml b/bin/day2412.ml new file mode 100644 index 0000000..3ab88a8 --- /dev/null +++ b/bin/day2412.ml @@ -0,0 +1,35 @@ +let find_regions grid = + let working = Array.make (Aoc.Grid.length grid) ~-1 in + let add_pos region pos perimeter lst = + if Aoc.Grid.pos_is_valid grid pos && Aoc.Grid.get_by_pos grid pos = region + then (Aoc.Grid.idx_of_pos grid pos :: lst, perimeter - 1) + else (lst, perimeter) + in + let rec scan_pos perimeter area id = function + | [] -> (perimeter, area) + | idx :: t when working.(idx) <> -1 -> scan_pos perimeter area id t + | idx :: t -> + working.(idx) <- id; + let x, y = Aoc.Grid.pos_of_idx grid idx in + let area = succ area in + let perimeter = perimeter + 4 in + let region = Aoc.Grid.get_by_idx grid idx in + let t, perimeter = add_pos region (x - 1, y) perimeter t in + let t, perimeter = add_pos region (x + 1, y) perimeter t in + let t, perimeter = add_pos region (x, y - 1) perimeter t in + let t, perimeter = add_pos region (x, y + 1) perimeter t in + scan_pos perimeter area id t + in + let rec impl acc idx id = + if idx >= Aoc.Grid.length grid then List.rev acc + else + let perimeter, area = scan_pos 0 0 id [ idx ] in + if area = 0 then impl acc (idx + 1) id + else impl ((perimeter, area) :: acc) (idx + 1) (id + 1) + in + impl [] 0 0 + +let part1 grid = + find_regions grid |> List.fold_left (fun acc (p, a) -> acc + (p * a)) 0 + +let _ = Aoc.main Aoc.Grid.of_file [ (string_of_int, part1) ] diff --git a/bin/dune b/bin/dune index ac41748..506ca60 100644 --- a/bin/dune +++ b/bin/dune @@ -10,7 +10,8 @@ day2408 day2409 day2410 - day2411) + day2411 + day2412) (names day2401 day2402 @@ -22,5 +23,6 @@ day2408 day2409 day2410 - day2411) + day2411 + day2412) (libraries str aoc))