summaryrefslogtreecommitdiff
path: root/2025/ocaml/lib/application/d04p02.ml
diff options
context:
space:
mode:
authorDJ O'Leary <dijitol@proton.me>2025-12-08 01:30:33 +0100
committerDJ O'Leary <dijitol@proton.me>2025-12-08 01:30:33 +0100
commit63c4dea442acb32db82318b4399ac05fb955e6d0 (patch)
treed6a1c5c33d5fdd15a278a11b2f9314835ae00911 /2025/ocaml/lib/application/d04p02.ml
parent4b3c8eb99443ccaeca831bba8e6604f1036fa301 (diff)
feat(2025d4): copy part 1 into part 2 file
Diffstat (limited to '2025/ocaml/lib/application/d04p02.ml')
-rw-r--r--2025/ocaml/lib/application/d04p02.ml42
1 files changed, 42 insertions, 0 deletions
diff --git a/2025/ocaml/lib/application/d04p02.ml b/2025/ocaml/lib/application/d04p02.ml
new file mode 100644
index 0000000..260c9e9
--- /dev/null
+++ b/2025/ocaml/lib/application/d04p02.ml
@@ -0,0 +1,42 @@
+open Domain
+
+let rec solve input () =
+ let matrix = Matrix.M.of_string input in
+ let count_paper lst = List.length @@ List.filter (fun c -> c <> ".") lst in
+ let accessible_rolls_of_paper = ref 0 in
+ for y = 0 to Array.length matrix - 1 do
+ for x = 0 to Array.length matrix.(y) - 1 do
+ if matrix.(y).(x) = "." then ()
+ else
+ let neighbour_coords = Matrix.M.get_valid_neighbours matrix x y in
+ let neighbours =
+ List.map (fun (x', y') -> Matrix.M.get matrix x' y') neighbour_coords
+ in
+ let paper_count = count_paper neighbours in
+ let is_accessible = paper_count < 4 in
+ if is_accessible then
+ accessible_rolls_of_paper := !accessible_rolls_of_paper + 1 ;
+ print_iteration_debug_msg x y neighbour_coords neighbours paper_count
+ is_accessible
+ done
+ done ;
+ !accessible_rolls_of_paper
+
+and print_iteration_debug_msg x y neighbour_coords neighbours paper_count
+ is_accessible =
+ Logs.debug (fun m ->
+ m
+ "coords=(%d,%d) neighbour_coords=[%s] neighbours=[%s] paper=%d \
+ is_accessible=%B"
+ x y
+ (List.fold_left
+ (fun acc (x, y) ->
+ if acc = "" then
+ " (" ^ string_of_int x ^ "," ^ string_of_int y ^ "); "
+ else acc ^ "(" ^ string_of_int x ^ "," ^ string_of_int y ^ "); " )
+ "" neighbour_coords )
+ (List.fold_left
+ (fun acc neighbour ->
+ if acc = "" then " " ^ neighbour ^ "; " else acc ^ neighbour ^ "; " )
+ "" neighbours )
+ paper_count is_accessible )