Skip to content

Commit f622916

Browse files
committed
Added day 2018-21
1 parent 57bcc01 commit f622916

File tree

1 file changed

+125
-0
lines changed

1 file changed

+125
-0
lines changed

2018/21-Chronal Conversion.py

Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
# -------------------------------- Input data ---------------------------------------- #
2+
import os, math
3+
4+
test_data = {}
5+
6+
test = "real"
7+
input_file = os.path.join(
8+
os.path.dirname(__file__),
9+
"Inputs",
10+
os.path.basename(__file__).replace(".py", ".txt"),
11+
)
12+
test_data[test] = {
13+
"input": open(input_file, "r+").read().strip(),
14+
"expected": ["15615244", "12963935"],
15+
}
16+
17+
# -------------------------------- Control program execution ------------------------- #
18+
19+
case_to_test = "real"
20+
part_to_test = 2
21+
22+
# -------------------------------- Initialize some variables ------------------------- #
23+
24+
puzzle_input = test_data[case_to_test]["input"]
25+
puzzle_expected_result = test_data[case_to_test]["expected"][part_to_test - 1]
26+
puzzle_actual_result = "Unknown"
27+
28+
29+
# -------------------------------- Actual code execution ----------------------------- #
30+
31+
registers = [0] * 6
32+
33+
init = puzzle_input.splitlines()[0]
34+
program = puzzle_input.splitlines()[1:]
35+
nb_lines = len(program)
36+
37+
pointer = int(init[4:])
38+
39+
40+
i = 0
41+
42+
if part_to_test == 1:
43+
while registers[pointer] < nb_lines:
44+
45+
operation = program[registers[pointer]]
46+
47+
opcode = operation.split(" ")[0]
48+
a, b, c = map(int, operation.split(" ")[1:])
49+
50+
if opcode == "addr":
51+
registers[c] = registers[a] + registers[b]
52+
elif opcode == "addi":
53+
registers[c] = registers[a] + b
54+
55+
elif opcode == "mulr":
56+
registers[c] = registers[a] * registers[b]
57+
elif opcode == "muli":
58+
registers[c] = registers[a] * b
59+
60+
elif opcode == "banr":
61+
registers[c] = registers[a] & registers[b]
62+
elif opcode == "bani":
63+
registers[c] = registers[a] & b
64+
65+
elif opcode == "borr":
66+
registers[c] = registers[a] | registers[b]
67+
elif opcode == "bori":
68+
registers[c] = registers[a] | b
69+
70+
elif opcode == "setr":
71+
registers[c] = registers[a]
72+
elif opcode == "seti":
73+
registers[c] = a
74+
75+
elif opcode == "gtir":
76+
registers[c] = 1 if a > registers[b] else 0
77+
elif opcode == "gtri":
78+
registers[c] = 1 if registers[a] > b else 0
79+
elif opcode == "gtrr":
80+
registers[c] = 1 if registers[a] > registers[b] else 0
81+
82+
elif opcode == "eqir":
83+
registers[c] = 1 if a == registers[b] else 0
84+
elif opcode == "eqri":
85+
registers[c] = 1 if registers[a] == b else 0
86+
elif opcode == "eqrr":
87+
registers[c] = 1 if registers[a] == registers[b] else 0
88+
89+
# The program stops if r0 = r5 on line 28
90+
if registers[pointer] == 28:
91+
puzzle_actual_result = registers[5]
92+
break
93+
94+
registers[pointer] += 1
95+
96+
97+
else:
98+
r5 = 0
99+
r4 = r5 | 65536
100+
r5 = 15466939
101+
r5 = (((r5 + (r4 & 255)) & 16777215) * 65899) & 16777215
102+
103+
list_values = []
104+
compared = []
105+
i = 0
106+
while (r4 if r4 > 256 else False, r5) not in list_values:
107+
list_values.append((r4 if r4 > 256 else False, r5))
108+
if r4 < 256:
109+
compared.append(r5)
110+
r4 = r5 | 65536
111+
r5 = 15466939
112+
else:
113+
r4 = r4 // 256
114+
r5 = (((r5 + (r4 & 255)) & 16777215) * 65899) & 16777215
115+
116+
i += 1
117+
if i == 10 ** 6:
118+
break
119+
120+
puzzle_actual_result = compared[-1]
121+
122+
# -------------------------------- Outputs / results --------------------------------- #
123+
124+
print("Expected result : " + str(puzzle_expected_result))
125+
print("Actual result : " + str(puzzle_actual_result))

0 commit comments

Comments
 (0)