Blame


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