Blob


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