tangled
alpha
login
or
join now
eldridge.cam
/
advent-of-code
2
fork
atom
Advent of Code solutions
2
fork
atom
overview
issues
pulls
pipelines
2021 day 24
eldridge.cam
2 months ago
96cfd997
1483302c
+178
2 changed files
expand all
collapse all
unified
split
2021
24
p1.pl
p2.pl
+89
2021/24/p1.pl
···
1
1
+
:- use_module(library(clpfd)).
2
2
+
:- use_module(library(dcg/basics)).
3
3
+
4
4
+
var(w) --> "w".
5
5
+
var(x) --> "x".
6
6
+
var(y) --> "y".
7
7
+
var(z) --> "z".
8
8
+
var(Int) --> integer(Int).
9
9
+
10
10
+
instruction(inp(V)) --> "inp ", var(V).
11
11
+
instruction(add(L, R)) --> "add ", var(L), " ", var(R).
12
12
+
instruction(mul(L, R)) --> "mul ", var(L), " ", var(R).
13
13
+
instruction(div(L, R)) --> "div ", var(L), " ", var(R).
14
14
+
instruction(mod(L, R)) --> "mod ", var(L), " ", var(R).
15
15
+
instruction(eql(L, R)) --> "eql ", var(L), " ", var(R).
16
16
+
17
17
+
instructions([]) --> [].
18
18
+
instructions([I | Is]) --> instruction(I), "\n", instructions(Is).
19
19
+
20
20
+
val(w, [W, _, _, _], W) :- !.
21
21
+
val(x, [_, X, _, _], X) :- !.
22
22
+
val(y, [_, _, Y, _], Y) :- !.
23
23
+
val(z, [_, _, _, Z], Z) :- !.
24
24
+
val(N, _, N) :- !.
25
25
+
26
26
+
update(w, [_, X, Y, Z], [W, X, Y, Z], W).
27
27
+
update(x, [W, _, Y, Z], [W, X, Y, Z], X).
28
28
+
update(y, [W, X, _, Z], [W, X, Y, Z], Y).
29
29
+
update(z, [W, X, Y, _], [W, X, Y, Z], Z).
30
30
+
31
31
+
unevaluate_instruction(inp(V), Previous, Next, W) :-
32
32
+
update(V, Previous, Next, W).
33
33
+
34
34
+
unevaluate_instruction(add(L, R), Previous, Next) :-
35
35
+
val(L, Previous, LV),
36
36
+
val(R, Previous, RV),
37
37
+
NV #= LV + RV,
38
38
+
update(L, Previous, Next, NV).
39
39
+
40
40
+
unevaluate_instruction(mul(L, R), Previous, Next) :-
41
41
+
val(L, Previous, LV),
42
42
+
val(R, Previous, RV),
43
43
+
NV #= LV * RV,
44
44
+
update(L, Previous, Next, NV).
45
45
+
46
46
+
unevaluate_instruction(div(L, R), Previous, Next) :-
47
47
+
val(L, Previous, LV),
48
48
+
val(R, Previous, RV),
49
49
+
NV #= LV // RV,
50
50
+
update(L, Previous, Next, NV).
51
51
+
52
52
+
unevaluate_instruction(mod(L, R), Previous, Next) :-
53
53
+
val(L, Previous, LV),
54
54
+
val(R, Previous, RV),
55
55
+
NV #= LV mod RV,
56
56
+
update(L, Previous, Next, NV).
57
57
+
58
58
+
unevaluate_instruction(eql(L, R), Previous, Next) :-
59
59
+
val(L, Previous, LV),
60
60
+
val(R, Previous, RV),
61
61
+
LV #= RV #<==> NV,
62
62
+
update(L, Previous, Next, NV).
63
63
+
64
64
+
unevaluate([], S, S, []).
65
65
+
unevaluate([I | Is], First, Last, Inputs) :-
66
66
+
unevaluate_instruction(I, Previous, Last),
67
67
+
!,
68
68
+
unevaluate(Is, First, Previous, Inputs).
69
69
+
unevaluate([I | Is], First, Last, [Input | Inputs]) :-
70
70
+
Input in 1..9,
71
71
+
unevaluate_instruction(I, Previous, Last, Input),
72
72
+
!,
73
73
+
unevaluate(Is, First, Previous, Inputs).
74
74
+
75
75
+
evaluate(Instructions, FinalState, Inputs) :-
76
76
+
reverse(Instructions, Snoitcurtsni),
77
77
+
unevaluate(Snoitcurtsni, [0, 0, 0, 0], FinalState, Stupni),
78
78
+
once(labeling([ff, down], Stupni)),
79
79
+
reverse(Stupni, Inputs).
80
80
+
81
81
+
main :-
82
82
+
read_stream_to_codes(user_input, Input),
83
83
+
string_codes(Input, InputCodes),
84
84
+
phrase(instructions(Instructions), InputCodes),
85
85
+
evaluate(Instructions, [_, _, _, 0], Inputs),
86
86
+
!,
87
87
+
atomic_list_concat(Inputs, Output),
88
88
+
write(Output),
89
89
+
write("\n").
+89
2021/24/p2.pl
···
1
1
+
:- use_module(library(clpfd)).
2
2
+
:- use_module(library(dcg/basics)).
3
3
+
4
4
+
var(w) --> "w".
5
5
+
var(x) --> "x".
6
6
+
var(y) --> "y".
7
7
+
var(z) --> "z".
8
8
+
var(Int) --> integer(Int).
9
9
+
10
10
+
instruction(inp(V)) --> "inp ", var(V).
11
11
+
instruction(add(L, R)) --> "add ", var(L), " ", var(R).
12
12
+
instruction(mul(L, R)) --> "mul ", var(L), " ", var(R).
13
13
+
instruction(div(L, R)) --> "div ", var(L), " ", var(R).
14
14
+
instruction(mod(L, R)) --> "mod ", var(L), " ", var(R).
15
15
+
instruction(eql(L, R)) --> "eql ", var(L), " ", var(R).
16
16
+
17
17
+
instructions([]) --> [].
18
18
+
instructions([I | Is]) --> instruction(I), "\n", instructions(Is).
19
19
+
20
20
+
val(w, [W, _, _, _], W) :- !.
21
21
+
val(x, [_, X, _, _], X) :- !.
22
22
+
val(y, [_, _, Y, _], Y) :- !.
23
23
+
val(z, [_, _, _, Z], Z) :- !.
24
24
+
val(N, _, N) :- !.
25
25
+
26
26
+
update(w, [_, X, Y, Z], [W, X, Y, Z], W).
27
27
+
update(x, [W, _, Y, Z], [W, X, Y, Z], X).
28
28
+
update(y, [W, X, _, Z], [W, X, Y, Z], Y).
29
29
+
update(z, [W, X, Y, _], [W, X, Y, Z], Z).
30
30
+
31
31
+
unevaluate_instruction(inp(V), Previous, Next, W) :-
32
32
+
update(V, Previous, Next, W).
33
33
+
34
34
+
unevaluate_instruction(add(L, R), Previous, Next) :-
35
35
+
val(L, Previous, LV),
36
36
+
val(R, Previous, RV),
37
37
+
NV #= LV + RV,
38
38
+
update(L, Previous, Next, NV).
39
39
+
40
40
+
unevaluate_instruction(mul(L, R), Previous, Next) :-
41
41
+
val(L, Previous, LV),
42
42
+
val(R, Previous, RV),
43
43
+
NV #= LV * RV,
44
44
+
update(L, Previous, Next, NV).
45
45
+
46
46
+
unevaluate_instruction(div(L, R), Previous, Next) :-
47
47
+
val(L, Previous, LV),
48
48
+
val(R, Previous, RV),
49
49
+
NV #= LV // RV,
50
50
+
update(L, Previous, Next, NV).
51
51
+
52
52
+
unevaluate_instruction(mod(L, R), Previous, Next) :-
53
53
+
val(L, Previous, LV),
54
54
+
val(R, Previous, RV),
55
55
+
NV #= LV mod RV,
56
56
+
update(L, Previous, Next, NV).
57
57
+
58
58
+
unevaluate_instruction(eql(L, R), Previous, Next) :-
59
59
+
val(L, Previous, LV),
60
60
+
val(R, Previous, RV),
61
61
+
LV #= RV #<==> NV,
62
62
+
update(L, Previous, Next, NV).
63
63
+
64
64
+
unevaluate([], S, S, []).
65
65
+
unevaluate([I | Is], First, Last, Inputs) :-
66
66
+
unevaluate_instruction(I, Previous, Last),
67
67
+
!,
68
68
+
unevaluate(Is, First, Previous, Inputs).
69
69
+
unevaluate([I | Is], First, Last, [Input | Inputs]) :-
70
70
+
Input in 1..9,
71
71
+
unevaluate_instruction(I, Previous, Last, Input),
72
72
+
!,
73
73
+
unevaluate(Is, First, Previous, Inputs).
74
74
+
75
75
+
evaluate(Instructions, FinalState, Inputs) :-
76
76
+
reverse(Instructions, Snoitcurtsni),
77
77
+
unevaluate(Snoitcurtsni, [0, 0, 0, 0], FinalState, Stupni),
78
78
+
once(labeling([ff, up], Stupni)),
79
79
+
reverse(Stupni, Inputs).
80
80
+
81
81
+
main :-
82
82
+
read_stream_to_codes(user_input, Input),
83
83
+
string_codes(Input, InputCodes),
84
84
+
phrase(instructions(Instructions), InputCodes),
85
85
+
evaluate(Instructions, [_, _, _, 0], Inputs),
86
86
+
!,
87
87
+
atomic_list_concat(Inputs, Output),
88
88
+
write(Output),
89
89
+
write("\n").