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):
2025-05-06 20:14:58 +02:00
input_file = "18.txt"
2021-11-01 16:40:46 +01:00
sound_freq = 0
queue = [], []
sent = [0, 0]
def __str__(self):
2025-05-06 20:14:58 +02:00
return "Day 18: Duet"
2021-11-01 16:40:46 +01:00
def _run(self, line, registry, swag_mode=True):
2025-05-06 20:14:58 +02:00
actions = "add jgz mod mul rcv set snd"
2021-11-01 16:40:46 +01:00
a, *kv = line.split()
if len(kv) == 2:
k, v = kv
else:
k = kv[0]
v = None
if a in actions:
2025-05-06 20:14:58 +02:00
if a == "add" and k in registry:
2021-11-01 16:40:46 +01:00
registry[k] += registry[v] if v in registry else int(v)
2025-05-06 20:14:58 +02:00
if a == "jgz": # damn you, 'jgz 1 3'
2021-11-01 16:40:46 +01:00
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
2025-05-06 20:14:58 +02:00
if a == "mod" and k in registry:
2021-11-01 16:40:46 +01:00
registry[k] %= registry[v] if v in registry else int(v)
2025-05-06 20:14:58 +02:00
if a == "mul" and k in registry:
2021-11-01 16:40:46 +01:00
registry[k] *= registry[v] if v in registry else int(v)
2025-05-06 20:14:58 +02:00
if a == "set":
2021-11-01 16:40:46 +01:00
registry[k] = registry[v] if v in registry else int(v)
if swag_mode: # Part 1: scientific wild-ass guess
2025-05-06 20:14:58 +02:00
if a == "rcv" and registry[k] != 0:
2021-11-01 16:40:46 +01:00
return self.STOP_SIGNAL
2025-05-06 20:14:58 +02:00
if a == "snd" and k in registry:
2021-11-01 16:40:46 +01:00
self.sound_freq = registry[k]
else: # part 2, actual instructions
2025-05-06 20:14:58 +02:00
if a == "rcv":
if len(self.queue[registry["_id"]]) == 0:
2021-11-01 16:40:46 +01:00
return 0
2025-05-06 20:14:58 +02:00
registry[k] = self.queue[registry["_id"]].pop(0)
if a == "snd":
self.sent[registry["_id"]] += 1
q = (registry["_id"] + 1) % 2
2021-11-01 16:40:46 +01:00
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):
2025-05-06 20:14:58 +02:00
registry = {"p": 0, "_id": 0}, {"p": 1, "_id": 1}
2021-11-01 16:40:46 +01:00
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]
2025-05-06 20:14:58 +02:00
if __name__ == "__main__":
2021-11-01 16:40:46 +01:00
solution = Solution()
solution.show_results()