summaryrefslogtreecommitdiff
path: root/2025/ocaml/lib/application/d04p01.ml
blob: 7c69de4e55a80bfa6fbc88305cadfc17719548dd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
open Domain

let err_empty_input = "input is empty"

let rec solve input () =
  if input = "" then Error err_empty_input
  else
    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 ;
    Ok !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 )