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