diff options
| author | DJ O'Leary <dijitol@proton.me> | 2025-12-08 01:30:33 +0100 |
|---|---|---|
| committer | DJ O'Leary <dijitol@proton.me> | 2025-12-08 01:30:33 +0100 |
| commit | 63c4dea442acb32db82318b4399ac05fb955e6d0 (patch) | |
| tree | d6a1c5c33d5fdd15a278a11b2f9314835ae00911 /2025/ocaml/lib/application/d04p02.ml | |
| parent | 4b3c8eb99443ccaeca831bba8e6604f1036fa301 (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.ml | 42 |
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 ) |
