blob: 260c9e9475b5bf202845a9f401c9301c5b464d77 (
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
|
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 )
|