advent-of-code/2017-python/solutions/day_18.py

95 lines
3.1 KiB
Python
Raw Normal View History

2021-11-01 16:40:46 +01:00
from solutions import BaseSolution
class Solution(BaseSolution):
input_file = '18.txt'
sound_freq = 0
queue = [], []
sent = [0, 0]
def __str__(self):
return 'Day 18: Duet'
def _run(self, line, registry, swag_mode=True):
actions = 'add jgz mod mul rcv set snd'
a, *kv = line.split()
if len(kv) == 2:
k, v = kv
else:
k = kv[0]
v = None
if a in actions:
if a == 'add' and k in registry:
registry[k] += registry[v] if v in registry else int(v)
if a == 'jgz': # damn you, 'jgz 1 3'
try:
k = int(k)
except ValueError:
k = registry[k] if k in registry else 0
try:
v = int(v)
except ValueError:
v = registry[v] if v in registry else 1
return v if k > 0 else 1
if a == 'mod' and k in registry:
registry[k] %= registry[v] if v in registry else int(v)
if a == 'mul' and k in registry:
registry[k] *= registry[v] if v in registry else int(v)
if a == 'set':
registry[k] = registry[v] if v in registry else int(v)
if swag_mode: # Part 1: scientific wild-ass guess
if a == 'rcv' and registry[k] != 0:
return self.STOP_SIGNAL
if a == 'snd' and k in registry:
self.sound_freq = registry[k]
else: # part 2, actual instructions
if a == 'rcv':
if len(self.queue[registry['_id']]) == 0:
return 0
registry[k] = self.queue[registry['_id']].pop(0)
if a == 'snd':
self.sent[registry['_id']] += 1
q = (registry['_id'] + 1) % 2
kk = registry[k] if k in registry else int(k)
self.queue[q].append(kk)
return 1
def solve(self, puzzle_input):
lines = puzzle_input.splitlines()
stop = len(lines)
self.STOP_SIGNAL = stop
i = 0
registry = {}
while i < stop:
i += self._run(lines[i], registry)
return self.sound_freq
def solve_again(self, puzzle_input):
registry = {'p': 0, '_id': 0}, {'p': 1, '_id': 1}
lines = puzzle_input.splitlines()
i = 0
j = 0
p0_queue = True
p1_queue = False
while p1_queue or p0_queue:
while p0_queue:
x = self._run(lines[i], registry[0], swag_mode=False)
if x == 0:
p0_queue = False
else:
i += x
p1_queue = len(self.queue[1]) > 0
while p1_queue:
x = self._run(lines[j], registry[1], swag_mode=False)
if x == 0:
p1_queue = False
else:
j += x
p0_queue = len(self.queue[0]) > 0
return self.sent[1]
if __name__ == '__main__':
solution = Solution()
solution.show_results()