Blame


1 1e5ad16d 2025-12-05 lh parse_input(File) :-
2 1e5ad16d 2025-12-05 lh read_file_to_string(File, Content, []),
3 1e5ad16d 2025-12-05 lh split_string(Content, "\n", "", Lines0),
4 1e5ad16d 2025-12-05 lh exclude(=(""), Lines0, Lines),
5 1e5ad16d 2025-12-05 lh maplist(parse_line, Lines).
6 1e5ad16d 2025-12-05 lh
7 1e5ad16d 2025-12-05 lh parse_line(Line) :-
8 1e5ad16d 2025-12-05 lh split_string(Line, "-", "", Parts),
9 1e5ad16d 2025-12-05 lh assert_value(Parts).
10 1e5ad16d 2025-12-05 lh
11 1e5ad16d 2025-12-05 lh assert_value([From0, To0]) :-
12 1e5ad16d 2025-12-05 lh number_string(From, From0),
13 1e5ad16d 2025-12-05 lh number_string(To, To0),
14 1e5ad16d 2025-12-05 lh assertz(fresh_range(From, To)).
15 1e5ad16d 2025-12-05 lh assert_value([Id0]) :-
16 1e5ad16d 2025-12-05 lh number_string(Id, Id0),
17 1e5ad16d 2025-12-05 lh assertz(ingredient(Id)).
18 1e5ad16d 2025-12-05 lh
19 1e5ad16d 2025-12-05 lh merge_fresh_ranges([fresh_range(From, To)], [fresh_range(From, To)]).
20 1e5ad16d 2025-12-05 lh merge_fresh_ranges([fresh_range(From1, To1), fresh_range(From2, To2) | Rest], Merged) :-
21 1e5ad16d 2025-12-05 lh ( From2 =< To1 + 1
22 1e5ad16d 2025-12-05 lh -> NewTo is max(To1, To2),
23 1e5ad16d 2025-12-05 lh merge_fresh_ranges([fresh_range(From1, NewTo) | Rest], Merged)
24 1e5ad16d 2025-12-05 lh ; merge_fresh_ranges([fresh_range(From2, To2) | Rest], MergedRest),
25 1e5ad16d 2025-12-05 lh Merged = [fresh_range(From1, To1) | MergedRest]
26 1e5ad16d 2025-12-05 lh ).
27 1e5ad16d 2025-12-05 lh
28 1e5ad16d 2025-12-05 lh merge_fresh_ranges() :-
29 1e5ad16d 2025-12-05 lh findall(fresh_range(From, To), fresh_range(From, To), Ranges0),
30 1e5ad16d 2025-12-05 lh maplist(retract, Ranges0),
31 1e5ad16d 2025-12-05 lh sort(Ranges0, Ranges1),
32 1e5ad16d 2025-12-05 lh merge_fresh_ranges(Ranges1, Ranges),
33 1e5ad16d 2025-12-05 lh maplist(assertz, Ranges).
34 1e5ad16d 2025-12-05 lh
35 1e5ad16d 2025-12-05 lh ingredient_fresh(Id) :-
36 1e5ad16d 2025-12-05 lh ingredient(Id),
37 1e5ad16d 2025-12-05 lh fresh_range(From, To),
38 1e5ad16d 2025-12-05 lh between(From, To, Id).
39 1e5ad16d 2025-12-05 lh
40 1e5ad16d 2025-12-05 lh fresh_range_id_count(From, To, Count) :-
41 1e5ad16d 2025-12-05 lh fresh_range(From, To),
42 1e5ad16d 2025-12-05 lh Count is To - From + 1.
43 1e5ad16d 2025-12-05 lh
44 1e5ad16d 2025-12-05 lh task1(Task1) :-
45 1e5ad16d 2025-12-05 lh aggregate_all(count, ingredient_fresh(_), Task1).
46 1e5ad16d 2025-12-05 lh
47 1e5ad16d 2025-12-05 lh task2(Task2) :-
48 1e5ad16d 2025-12-05 lh aggregate_all(sum(Count), fresh_range_id_count(_, _, Count), Task2).
49 1e5ad16d 2025-12-05 lh
50 1e5ad16d 2025-12-05 lh :-
51 1e5ad16d 2025-12-05 lh parse_input("input/05.txt"),
52 1e5ad16d 2025-12-05 lh merge_fresh_ranges(),
53 1e5ad16d 2025-12-05 lh task1(Task1),
54 1e5ad16d 2025-12-05 lh task2(Task2),
55 1e5ad16d 2025-12-05 lh format("~d ~d~n", [Task1, Task2]).