Advent of Code solutions

2021 day 24

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