Solve 2018 day 21, 2020 day 12 and improve 2022 day 19
This commit is contained in:
52
2018/d21.py
Normal file
52
2018/d21.py
Normal file
@@ -0,0 +1,52 @@
|
||||
from lib import get_data, str_to_ints
|
||||
import d16
|
||||
|
||||
|
||||
def run(data, break_after=None, reg_zero_init=0):
|
||||
ip = None
|
||||
regs = [0 for _ in range(6)]
|
||||
regs[0] = reg_zero_init
|
||||
|
||||
insts = []
|
||||
for line in data.splitlines():
|
||||
if line.startswith("#"):
|
||||
(ip,) = str_to_ints(line)
|
||||
else:
|
||||
fs = line.split()
|
||||
vals = str_to_ints(line)
|
||||
insts.append([fs[0]] + vals)
|
||||
|
||||
count = 0
|
||||
assert ip is not None
|
||||
seen = set()
|
||||
last_added = None
|
||||
while regs[ip] < len(insts):
|
||||
if break_after is not None and count > break_after:
|
||||
break
|
||||
if regs[ip] == 28:
|
||||
r4 = regs[4]
|
||||
|
||||
if len(seen) == 0:
|
||||
print(r4)
|
||||
|
||||
if r4 in seen:
|
||||
print(last_added)
|
||||
break
|
||||
else:
|
||||
seen.add(r4)
|
||||
last_added = r4
|
||||
|
||||
inst = insts[regs[ip]]
|
||||
f = getattr(d16, inst[0])
|
||||
f(regs, *inst[1:])
|
||||
regs[ip] += 1
|
||||
count += 1
|
||||
|
||||
|
||||
def main():
|
||||
data = get_data(__file__)
|
||||
run(data, reg_zero_init=333)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user