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)).
11 split_string(Line, ": ", "", Parts),
12 [Device, _ | Outputs] = Parts,
13 maplist(assert_device_output(Device), Outputs).
16 sum_pairs([[A, B] | Rest], SumA, SumB) :-
17 sum_pairs(Rest, RestSumA, RestSumB),
21 :- dynamic cached_result/4.
23 paths("out", Dac/Fft, 1, Task2) :-
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)),
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).
45 parse_input("input/11.txt"),
46 paths("you", Task1, _),
47 paths("svr", _, Task2),
48 format("~d ~d~n", [Task1, Task2]).