Blame


1 bb300da9 2025-12-04 lh parse_input(File) :-
2 bb300da9 2025-12-04 lh read_file_to_string(File, Content, []),
3 bb300da9 2025-12-04 lh split_string(Content, "\n", "", Lines0),
4 bb300da9 2025-12-04 lh exclude(=(""), Lines0, Lines),
5 bb300da9 2025-12-04 lh length(Lines, Length),
6 bb300da9 2025-12-04 lh numlist(1, Length, Ys),
7 bb300da9 2025-12-04 lh maplist(assert_line, Lines, Ys).
8 bb300da9 2025-12-04 lh
9 bb300da9 2025-12-04 lh assert_line(Line, Y) :-
10 bb300da9 2025-12-04 lh string_chars(Line, Chars),
11 bb300da9 2025-12-04 lh assert_chars(Chars, 1, Y).
12 bb300da9 2025-12-04 lh
13 bb300da9 2025-12-04 lh assert_chars([], _, _).
14 bb300da9 2025-12-04 lh assert_chars([C|Rest], X, Y) :-
15 bb300da9 2025-12-04 lh assert_field(C, X, Y),
16 bb300da9 2025-12-04 lh X2 is X + 1,
17 bb300da9 2025-12-04 lh assert_chars(Rest, X2, Y).
18 bb300da9 2025-12-04 lh
19 bb300da9 2025-12-04 lh assert_field('@', X, Y) :-
20 bb300da9 2025-12-04 lh assertz(roll(X, Y)).
21 bb300da9 2025-12-04 lh assert_field(_, _, _).
22 bb300da9 2025-12-04 lh
23 bb300da9 2025-12-04 lh forklift_access(X, Y) :-
24 bb300da9 2025-12-04 lh roll(X, Y),
25 bb300da9 2025-12-04 lh neighbour_count(X, Y, N),
26 bb300da9 2025-12-04 lh N < 4.
27 bb300da9 2025-12-04 lh
28 bb300da9 2025-12-04 lh neighbour_offset(DX, DY) :-
29 bb300da9 2025-12-04 lh between(-1, 1, DX),
30 bb300da9 2025-12-04 lh between(-1, 1, DY),
31 bb300da9 2025-12-04 lh \+ (DX = 0, DY = 0).
32 bb300da9 2025-12-04 lh
33 bb300da9 2025-12-04 lh has_neighbour(X, Y, DX, DY) :-
34 bb300da9 2025-12-04 lh neighbour_offset(DX, DY),
35 bb300da9 2025-12-04 lh NX is X + DX,
36 bb300da9 2025-12-04 lh NY is Y + DY,
37 bb300da9 2025-12-04 lh roll(NX, NY).
38 bb300da9 2025-12-04 lh
39 bb300da9 2025-12-04 lh neighbour_count(X, Y, N) :-
40 bb300da9 2025-12-04 lh aggregate_all(count, has_neighbour(X, Y, _, _), N).
41 bb300da9 2025-12-04 lh
42 bb300da9 2025-12-04 lh task1(N) :-
43 bb300da9 2025-12-04 lh aggregate_all(count, forklift_access(_, _), N).
44 bb300da9 2025-12-04 lh
45 bb300da9 2025-12-04 lh task2_(C0, Total) :-
46 bb300da9 2025-12-04 lh findall(roll(X, Y), forklift_access(X, Y), List),
47 bb300da9 2025-12-04 lh maplist(retract, List),
48 bb300da9 2025-12-04 lh length(List, C1),
49 bb300da9 2025-12-04 lh C3 is C0 + C1,
50 bb300da9 2025-12-04 lh ( C1 = 0
51 bb300da9 2025-12-04 lh -> Total is C3
52 bb300da9 2025-12-04 lh ; task2_(C3, Total)
53 bb300da9 2025-12-04 lh ).
54 bb300da9 2025-12-04 lh
55 bb300da9 2025-12-04 lh task2(N) :-
56 bb300da9 2025-12-04 lh task2_(0, N).
57 bb300da9 2025-12-04 lh
58 bb300da9 2025-12-04 lh :-
59 bb300da9 2025-12-04 lh parse_input("input/04.txt"),
60 bb300da9 2025-12-04 lh task1(Task1),
61 bb300da9 2025-12-04 lh task2(Task2),
62 bb300da9 2025-12-04 lh format("~d ~d~n", [Task1, Task2]).