commit - 1e5ad16d85822ce1dcc76eb62c6c3ee0a0a2fdbb
commit + d2a7af01b1bea3fca743d29a47e78c1d704be047
blob - /dev/null
blob + 31b0c67735f5877e23fe7b005105b5c313ac80a6 (mode 644)
--- /dev/null
+++ 11.pl
+parse_input(File) :-
+ read_file_to_string(File, Content, []),
+ split_string(Content, "\n", "", Lines0),
+ exclude(=(""), Lines0, Lines),
+ maplist(assert_line, Lines).
+
+assert_device_output(Device, Output) :-
+ assertz(device_output(Device, Output)).
+
+assert_line(Line) :-
+ split_string(Line, ": ", "", Parts),
+ [Device, _ | Outputs] = Parts,
+ maplist(assert_device_output(Device), Outputs).
+
+sum_pairs([], 0, 0).
+sum_pairs([[A, B] | Rest], SumA, SumB) :-
+ sum_pairs(Rest, RestSumA, RestSumB),
+ SumA is RestSumA + A,
+ SumB is RestSumB + B.
+
+:- dynamic cached_result/4.
+
+paths("out", Dac/Fft, 1, Task2) :-
+ Dac == seen,
+ Fft == seen
+ -> Task2 = 1
+ ; Task2 = 0.
+
+paths(Current, Flags, Task1, Task2) :-
+ cached_result(Current, Flags, Task1, Task2), !.
+
+paths(Current, Dac/Fft, Task1, Task2) :-
+ ((Dac == seen ; Current == "dac") -> Dac1 = seen ; Dac1 = unseen),
+ ((Fft == seen ; Current == "fft") -> Fft1 = seen ; Fft1 = unseen),
+ findall([Task1, Task2], (device_output(Current, Next),
+ paths(Next, Dac1/Fft1, Task1, Task2)),
+ Pairs),
+ sum_pairs(Pairs, Task1, Task2),
+ assertz(cached_result(Current, Dac/Fft, Task1, Task2)).
+
+paths(Current, Task1, Task2) :-
+ paths(Current, unseen/unseen, Task1, Task2).
+
+:-
+ parse_input("input/11.txt"),
+ paths("you", Task1, _),
+ paths("svr", _, Task2),
+ format("~d ~d~n", [Task1, Task2]).