Commit Diff


commit - 3d926f58b1a1f42fc4a7d3f34c8cde8aefb5b92f
commit + ca2c4eaaf9aba78538be353cbdc628cf21b35424
blob - /dev/null
blob + 1261c8387e82d9ed86ba02cdb3931d949949cd33 (mode 644)
--- /dev/null
+++ 03.pl
@@ -0,0 +1,61 @@
+:- use_module(library(list_util)).
+
+number_char(Number, Char) :-
+    number_chars(Number, [Char]).
+
+line_bank(Line, Bank) :-
+    string_chars(Line, Chars),
+    maplist(number_char, Bank, Chars).
+
+parse_input(File, Banks) :-
+    read_file_to_string(File, Content, []),
+    split_string(Content, "\n", "", Lines0),
+    exclude(=(""), Lines0, Lines),
+    maplist(line_bank, Lines, Banks).
+
+max_list_index([H|T], MaxI, Max) :-
+    max_list_index(T, 1, H, 0, Max, MaxI).
+
+max_list_index([], _, Max0, MaxI0, Max, MaxI) :-
+    Max = Max0,
+    MaxI = MaxI0.
+
+max_list_index([H|T], I0, Max0, MaxI0, Max, MaxI) :-
+    I1 is I0 + 1,
+    ( H > Max0
+    -> max_list_index(T, I1, H,    I0,    Max, MaxI)
+    ;  max_list_index(T, I1, Max0, MaxI0, Max, MaxI)
+    ).
+
+bank_joltage_(_, _, J, 0, J).
+bank_joltage_(_, 0, J, _, J).
+bank_joltage_([], _, J, _, J).
+bank_joltage_(Bank, N0, Joltage, Window0, Last) :-
+    length(Bank, Length),
+    Window is min(Length, Window0),
+    split_at(Window, Bank, Search, _),
+    max_list_index(Search, I, N),
+    S is I + 1,
+    split_at(S, Bank, _, Rest),
+    RemainingWindow is Window0 - I,
+    J is Last * 10 + N,
+    N1 is N0 - 1,
+    bank_joltage_(Rest, N1, Joltage, RemainingWindow, J).
+
+bank_joltage(Bank, N, Joltage) :-
+    length(Bank, Length),
+    Window is Length - N + 1,
+    bank_joltage_(Bank, N, Joltage, Window, 0).
+
+solve([], 0, 0).
+solve([Bank|Rest], Task1, Task2) :-
+    bank_joltage(Bank, 2, T1Joltage0),
+    bank_joltage(Bank, 12, T2Joltage0),
+    solve(Rest, T1Joltage1, T2Joltage1),
+    Task1 is T1Joltage0 + T1Joltage1,
+    Task2 is T2Joltage0 + T2Joltage1.
+
+:-
+    parse_input("input/03.txt", Banks),
+    solve(Banks, Task1, Task2),
+    format("~d ~d~n", [Task1, Task2]).