-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathday8.pl
More file actions
executable file
·34 lines (26 loc) · 1.1 KB
/
Copy pathday8.pl
File metadata and controls
executable file
·34 lines (26 loc) · 1.1 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
#!/usr/bin/env swipl -O -t main --quiet
:- use_module(library(dcg/basics), [integer//1]).
node(node([], Ms)) --> integer(0), ` `, integer(M), ` `, meta(M, Ms).
node(node(Cs, Ms)) --> integer(C), ` `, integer(M), ` `, nodes(C, Cs), ` `, meta(M, Ms).
nodes(0, []) --> [].
nodes(1, [N]) --> node(N).
nodes(X, [N | Ns]) --> node(N), ` `, {XX is X - 1}, nodes(XX, Ns).
meta(0, []) --> [].
meta(1, [M]) --> integer(M).
meta(X, [M | Ms]) --> integer(M), {XX is X - 1}, ` `, meta(XX, Ms).
sum_metadata(node(Children, Meta), S) :-
maplist(sum_metadata, Children, CS), sum_list(CS, S1), sum_list(Meta, S2), S is S1 + S2.
get_children_ref(_, [], []).
get_children_ref(Children, [M | Meta], Result) :-
get_children_ref(Children, Meta, R),
(nth1(M, Children, C) -> Result = [C | R] ; Result = R).
value(node([], Meta), V) :- sum_list(Meta, V).
value(node(Children, Meta), V) :-
get_children_ref(Children, Meta, Refs),
maplist(value, Refs, S), sum_list(S, V).
main :-
read_string(user_input, _, S), string_codes(S, C), phrase(node(N), C, _),
sum_metadata(N, Part1),
writeln(Part1),
value(N, Part2),
writeln(Part2).