Skip to content

Instantly share code, notes, and snippets.

@BeyondEvil
Created December 18, 2017 23:41
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save BeyondEvil/60dd9a2f2cd47bafe3b4ea401f2e5bb5 to your computer and use it in GitHub Desktop.
Save BeyondEvil/60dd9a2f2cd47bafe3b4ea401f2e5bb5 to your computer and use it in GitHub Desktop.
from collections import defaultdict
def read_input():
with open('input.txt', 'r') as f:
return f.read().strip()
def get(reg, v):
try:
return int(v)
except ValueError:
return int(reg[v])
queue = [[] for _ in range(2)]
def run(seq, program):
instructions = seq.split('\n')
registers = defaultdict(int)
registers['p'] = program
index = 0
snds = 0
while True:
try:
cmd = instructions[index].split()
if cmd[0] == 'snd':
queue[1 - registers['p']].append(get(registers, cmd[1]))
snds += 1
yield snds
if cmd[0] == 'set':
registers[cmd[1]] = get(registers, cmd[2])
if cmd[0] == 'add':
registers[cmd[1]] += get(registers, cmd[2])
if cmd[0] == 'mul':
registers[cmd[1]] *= get(registers, cmd[2])
if cmd[0] == 'mod':
registers[cmd[1]] %= get(registers, cmd[2])
if cmd[0] == 'rcv': # and registers[cmd[1]] != 0:
registers[cmd[1]] = queue[registers['p']].pop(0)
yield snds
if cmd[0] == 'jgz' and registers[cmd[1]] > 0:
index += get(registers, cmd[2])
else:
index += 1
except:
return
def run_it_part2(seq):
p_zero = run(seq, 0)
p_one = run(seq, 1)
value = None
while True:
try:
next(p_zero)
value = next(p_one)
except StopIteration:
break
print(value)
if __name__ == '__main__':
seq = read_input()
run_it_part2(seq)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment