-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathday07.prolog
More file actions
44 lines (34 loc) · 1.44 KB
/
day07.prolog
File metadata and controls
44 lines (34 loc) · 1.44 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
:- use_module(library(dcg/basics)).
:- use_module(library(dcg/high_order)).
:- use_module(library(lists)).
:- use_module(library(pio)).
exec(Part, Path, Answer) :-
phrase_from_file(input(Equations), Path),
call(Part, Equations, Answer).
part1(Equations, Answer) :-
include(valid_equation(simple), Equations, ValidEquations),
maplist(arg(1), ValidEquations, ValidResults),
sum_list(ValidResults, Answer).
part2(Equations, Answer) :-
include(valid_equation(ext), Equations, ValidEquations),
maplist(arg(1), ValidEquations, ValidResults),
sum_list(ValidResults, Answer).
input(Equations) --> sequence(equation, Equations).
equation(TestValue-Numbers) -->
integer(TestValue), ": ", sequence(integer, " ", Numbers), optional_newline.
optional_newline --> "\n" | [].
%! operator(Type, X, Y, Result).
% True if combination of X and Y with some operator can produce Result.
operator(_, X, Y, Result) :- Result is X + Y.
operator(_, X, Y, Result) :- Result is X * Y.
operator(ext, X, Y, Result) :-
atomic_concat(X, Y, C),
atom_number(C, Result).
%! eval_equation(Type, Result:integer, Numbers:list).
% True if Numbers could be combined with operators to produce the Result. Type
% can be 'simple' or 'ext' (to support || operator).
eval_equation(_, R, [R]).
eval_equation(Type, R, [X, Y | Rest]) :-
operator(Type, X, Y, D1),
eval_equation(Type, R, [D1 | Rest]).
valid_equation(Type, Result-Numbers) :- eval_equation(Type, Result, Numbers).