Instantly share code, notes, and snippets.

Embed
What would you like to do?
Solution to Day 18: Duet
#!/bin/python
#aoc_d18.py
inp = [
"set a 1",
"add a 2",
"mul a a",
"mod a 5",
"snd a",
"set a 0",
"rcv a",
"jgz a -1",
"set a 1",
"jgz a -2"]
inp = open('input_d18.txt','r').readlines()
regs = {'p':0}
last_freq = 0
pc = 0
import re
while True:
i = inp[pc]
print i
if i.startswith("set"):
m = re.match("set\s([a-z])\s(-?\d+)",i)
if m:
regs[m.group(1)] = int(m.group(2))
else:
m = re.match("set\s([a-z])\s([a-z])",i)
regs[m.group(1)] = regs[m.group(2)]
if i.startswith("add"):
m = re.match("add\s([a-z])\s(-?\d+)",i)
regs[m.group(1)] += int(m.group(2))
if i.startswith("mul"):
m = re.match("mul\s([a-z])\s([a-z])",i)
if m:
regs[m.group(1)] *= regs[m.group(2)]
else:
m = re.match("mul\s([a-z])\s(-?\d+)",i)
regs[m.group(1)] *= int(m.group(2))
if i.startswith("snd"):
m = re.match("snd\s([a-z])",i)
last_freq = regs[m.group(1)]
if i.startswith("mod"):
m = re.match("mod\s([a-z])\s(-?\d+)",i)
if m:
regs[m.group(1)] %= int(m.group(2))
else:
m = re.match("mod\s([a-z])\s([a-z])",i)
regs[m.group(1)] %= regs[m.group(2)]
if i.startswith("rcv"):
m = re.match("rcv\s([a-z])",i)
if regs[m.group(1)] != 0:
print last_freq
break
if i.startswith("jgz"):
m = re.match("jgz\s([a-z])\s(-?\d+)",i)
if m:
if regs[m.group(1)] > 0:
pc += int(m.group(2))
continue
else:
m = re.match("jgz\s([a-z])\s([a-z])",i)
if regs[m.group(1)] > 0:
pc += regs[m.group(2)]
continue
pc += 1
if pc >= len(inp):
break
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment