Blob


1 :- use_module(library(list_util)).
3 number_char(Number, Char) :-
4 number_chars(Number, [Char]).
6 line_bank(Line, Bank) :-
7 string_chars(Line, Chars),
8 maplist(number_char, Bank, Chars).
10 parse_input(File, Banks) :-
11 read_file_to_string(File, Content, []),
12 split_string(Content, "\n", "", Lines0),
13 exclude(=(""), Lines0, Lines),
14 maplist(line_bank, Lines, Banks).
16 max_list_index([H|T], MaxI, Max) :-
17 max_list_index(T, 1, H, 0, Max, MaxI).
19 max_list_index([], _, Max0, MaxI0, Max, MaxI) :-
20 Max = Max0,
21 MaxI = MaxI0.
23 max_list_index([H|T], I0, Max0, MaxI0, Max, MaxI) :-
24 I1 is I0 + 1,
25 ( H > Max0
26 -> max_list_index(T, I1, H, I0, Max, MaxI)
27 ; max_list_index(T, I1, Max0, MaxI0, Max, MaxI)
28 ).
30 bank_joltage_(_, _, J, 0, J).
31 bank_joltage_(_, 0, J, _, J).
32 bank_joltage_([], _, J, _, J).
33 bank_joltage_(Bank, N0, Joltage, Window0, Last) :-
34 length(Bank, Length),
35 Window is min(Length, Window0),
36 split_at(Window, Bank, Search, _),
37 max_list_index(Search, I, N),
38 S is I + 1,
39 split_at(S, Bank, _, Rest),
40 RemainingWindow is Window0 - I,
41 J is Last * 10 + N,
42 N1 is N0 - 1,
43 bank_joltage_(Rest, N1, Joltage, RemainingWindow, J).
45 bank_joltage(Bank, N, Joltage) :-
46 length(Bank, Length),
47 Window is Length - N + 1,
48 bank_joltage_(Bank, N, Joltage, Window, 0).
50 solve([], 0, 0).
51 solve([Bank|Rest], Task1, Task2) :-
52 bank_joltage(Bank, 2, T1Joltage0),
53 bank_joltage(Bank, 12, T2Joltage0),
54 solve(Rest, T1Joltage1, T2Joltage1),
55 Task1 is T1Joltage0 + T1Joltage1,
56 Task2 is T2Joltage0 + T2Joltage1.
58 :-
59 parse_input("input/03.txt", Banks),
60 solve(Banks, Task1, Task2),
61 format("~d ~d~n", [Task1, Task2]).