8000 Add Day 19 · nthistle/advent-of-code@cb36a1c · GitHub
[go: up one dir, main page]

Skip to content

Commit cb36a1c

Browse files
committed
Add Day 19
1 parent cfd7da6 commit cb36a1c

File tree

2 files changed

+145
-0
lines changed

2 files changed

+145
-0
lines changed

day-19/day_19.py

Lines changed: 108 additions & 0 deletions
+
op_dict[prog[ip][0]](reg, *prog[ip][1:])
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
import time
2+
3+
with open("input.txt") as file:
4+
inp = file.read().strip()
5+
6+
prog = inp.split("\n")
7+
prog = [c.split(" ") for c in prog]
8+
prog = [[c[0],*map(int,c[1:])] for c in prog]
9+
10+
def addr(reg,a,b,c):
11+
reg[c] = reg[a] + reg[b]
12+
13+
def addi(reg,a,b,c):
14+
reg[c] = reg[a] + b
15+
16+
def mulr(reg,a,b,c):
17+
reg[c] = reg[a] * reg[b]
18+
19+
def muli(reg,a,b,c):
20+
reg[c] = reg[a] * b
21+
22+
def banr(reg,a,b,c):
23+
reg[c] = reg[a] & reg[b]
24+
25+
def bani(reg,a,b,c):
26+
reg[c] = reg[a] & b
27+
28+
def borr(reg,a,b,c):
29+
reg[c] = reg[a] | reg[b]
30+
31+
def bori(reg,a,b,c):
32+
reg[c] = reg[a] | b
33+
34+
def setr(reg,a,b,c):
35+
reg[c] = reg[a]
36+
37+
def seti(reg,a,b,c):
38+
reg[c] = a
39+
40+
def gtir(reg,a,b,c):
41+
if a > reg[b]:
42+
reg[c] = 1
43+
else:
44+
reg[c] = 0
45+
46+
def gtri(reg,a,b,c):
47+
if reg[a] > b:
48+
reg[c] = 1
49+
else:
50+
reg[c] = 0
51+
52+
def gtrr(reg,a,b,c):
53+
if reg[a] > reg[b]:
54+
reg[c] = 1
55+
else:
56+
reg[c] = 0
57+
58+
def eqir(reg,a,b,c):
59+
if a == reg[b]:
60+
reg[c] = 1
61+
else:
62+
reg[c] = 0
63+
64+
def eqri(reg,a,b,c):
65+
if reg[a] == b:
66+
reg[c] = 1
67+
else:
68+
reg[c] = 0
69+
70+
def eqrr(reg,a,b,c):
71+
if reg[a] == reg[b]:
72+
reg[c] = 1
73+
else:
74+
reg[c] = 0
75+
76+
ops = [addr, addi, mulr, muli, banr, bani,
77+
borr, bori, setr, seti, gtir, gtri,
78+
gtrr, eqir, eqri, eqrr]
79+
op_dict = {op.__name__:op for op in ops}
80+
81+
reg = [0,0,0,0,0,0]
82+
ip = 0
83+
ip_reg = prog[0][1]
84+
prog = prog[1:]
85+
while ip in range(len(prog)):
86+
reg[ip_reg] = ip
87
88+
ip = reg[ip_reg]
89+
ip += 1
90+
91+
print("Part 1:",reg[0])
92+
93+
reg = [1,0,0,0,0,0]
94+
ip = 0
95+
for k in range(30): # enough to generate the input
96+
reg[ip_reg] = ip
97+
op_dict[prog[ip][0]](reg, *prog[ip][1:])
98+
ip = reg[ip_reg]
99+
ip += 1
100+
101+
acc = 0
102+
n = max(reg) # janky, but works
103+
# in practice I identified this by hand
104+
105+
for k in range(1,n+1):
106+
if n % k == 0:
107+
acc += k
108+
print("Part 2:",acc)

day-19/input.txt

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
#ip 2
2+
addi 2 16 2
3+
seti 1 4 3
4+
seti 1 5 1
5+
mulr 3 1 5
6+
eqrr 5 4 5
7+
addr 5 2 2
8+
addi 2 1 2
9+
addr 3 0 0
10+
addi 1 1 1
11+
gtrr 1 4 5
12+
addr 2 5 2
13+
seti 2 9 2
14+
addi 3 1 3
15+
gtrr 3 4 5
16+
addr 5 2 2
17+
seti 1 6 2
18+
mulr 2 2 2
19+
addi 4 2 4
20+
mulr 4 4 4
21+
mulr 2 4 4
22+
muli 4 11 4
23+
addi 5 7 5
24+
mulr 5 2 5
25+
addi 5 4 5
26+
addr 4 5 4
27+
addr 2 0 2
28+
seti 0 1 2
29+
setr 2 1 5
30+
mulr 5 2 5
31+
addr 2 5 5
32+
mulr 2 5 5
33+
muli 5 14 5
34+
mulr 5 2 5
35+
addr 4 5 4
36+
seti 0 6 0
37+
seti 0 6 2

0 commit comments

Comments
 (0)
0