Blob


1 parse_input(File) :-
2 read_file_to_string(File, Content, []),
3 split_string(Content, "\n", "", Lines0),
4 exclude(=(""), Lines0, Lines),
5 maplist(assert_line, Lines).
7 assert_device_output(Device, Output) :-
8 assertz(device_output(Device, Output)).
10 assert_line(Line) :-
11 split_string(Line, ": ", "", Parts),
12 [Device, _ | Outputs] = Parts,
13 maplist(assert_device_output(Device), Outputs).
15 sum_pairs([], 0, 0).
16 sum_pairs([[A, B] | Rest], SumA, SumB) :-
17 sum_pairs(Rest, RestSumA, RestSumB),
18 SumA is RestSumA + A,
19 SumB is RestSumB + B.
21 :- dynamic cached_result/4.
23 paths("out", Dac/Fft, 1, Task2) :-
24 Dac == seen,
25 Fft == seen
26 -> Task2 = 1
27 ; Task2 = 0.
29 paths(Current, Flags, Task1, Task2) :-
30 cached_result(Current, Flags, Task1, Task2), !.
32 paths(Current, Dac/Fft, Task1, Task2) :-
33 ((Dac == seen ; Current == "dac") -> Dac1 = seen ; Dac1 = unseen),
34 ((Fft == seen ; Current == "fft") -> Fft1 = seen ; Fft1 = unseen),
35 findall([Task1, Task2], (device_output(Current, Next),
36 paths(Next, Dac1/Fft1, Task1, Task2)),
37 Pairs),
38 sum_pairs(Pairs, Task1, Task2),
39 assertz(cached_result(Current, Dac/Fft, Task1, Task2)).
41 paths(Current, Task1, Task2) :-
42 paths(Current, unseen/unseen, Task1, Task2).
44 :-
45 parse_input("input/11.txt"),
46 paths("you", Task1, _),
47 paths("svr", _, Task2),
48 format("~d ~d~n", [Task1, Task2]).