Commit Diff


commit - 1e5ad16d85822ce1dcc76eb62c6c3ee0a0a2fdbb
commit + d2a7af01b1bea3fca743d29a47e78c1d704be047
blob - /dev/null
blob + 31b0c67735f5877e23fe7b005105b5c313ac80a6 (mode 644)
--- /dev/null
+++ 11.pl
@@ -0,0 +1,48 @@
+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]).