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()