day18
This commit is contained in:
parent
9a5897748b
commit
700e3fdf30
114
day18.py
Normal file
114
day18.py
Normal file
@ -0,0 +1,114 @@
|
||||
import time
|
||||
from collections import defaultdict
|
||||
from threading import Thread
|
||||
from tools.aoc import AOCDay
|
||||
from typing import Any
|
||||
from queue import Queue
|
||||
|
||||
|
||||
class Duet(Thread):
|
||||
def __init__(self, commands: list, pid: int = 0, input_queue: Queue = None, export_queue: Queue = None) -> None:
|
||||
super().__init__()
|
||||
self.commands = commands
|
||||
self.pid = pid
|
||||
self.input_queue = input_queue
|
||||
self.export_queue = export_queue
|
||||
self.state = 0
|
||||
self.output = 0
|
||||
|
||||
def run(self) -> None:
|
||||
last_freq = 0
|
||||
register = defaultdict(int)
|
||||
register['p'] = self.pid
|
||||
index = 0
|
||||
while 0 <= index < len(self.commands):
|
||||
cmd = self.commands[index]
|
||||
|
||||
if len(cmd) == 3:
|
||||
value_index = 2
|
||||
else:
|
||||
value_index = 1
|
||||
|
||||
try:
|
||||
value = int(cmd[value_index])
|
||||
except ValueError:
|
||||
value = register[cmd[value_index]]
|
||||
|
||||
match cmd[0]:
|
||||
case "snd":
|
||||
last_freq = value
|
||||
if self.export_queue is not None:
|
||||
self.export_queue.put(value)
|
||||
self.output += 1
|
||||
case "set":
|
||||
register[cmd[1]] = value
|
||||
case "add":
|
||||
register[cmd[1]] += value
|
||||
case "mul":
|
||||
register[cmd[1]] *= value
|
||||
case "mod":
|
||||
register[cmd[1]] %= value
|
||||
case "rcv":
|
||||
if self.input_queue is not None:
|
||||
self.state = 1
|
||||
while self.input_queue.empty():
|
||||
time.sleep(0.01)
|
||||
register[cmd[1]] = self.input_queue.get()
|
||||
self.state = 0
|
||||
else:
|
||||
if register[cmd[1]] != 0:
|
||||
self.output = last_freq
|
||||
return
|
||||
case "jgz":
|
||||
try:
|
||||
if int(cmd[1]) > 0:
|
||||
index += value - 1
|
||||
except ValueError:
|
||||
if register[cmd[1]] > 0:
|
||||
index += value - 1
|
||||
case _:
|
||||
raise ValueError("Unknown command: " + cmd[0])
|
||||
|
||||
index += 1
|
||||
|
||||
return
|
||||
|
||||
|
||||
class Day(AOCDay):
|
||||
inputs = [
|
||||
[
|
||||
(4, "input18_test"),
|
||||
(7071, "input18")
|
||||
],
|
||||
[
|
||||
(3, "input18_test2"),
|
||||
(8001, "input18")
|
||||
]
|
||||
]
|
||||
|
||||
def part1(self) -> Any:
|
||||
duet = Duet([x.split(" ") for x in self.getInput()])
|
||||
duet.start()
|
||||
duet.join()
|
||||
return duet.output
|
||||
|
||||
def part2(self) -> Any:
|
||||
q1, q2 = Queue(), Queue()
|
||||
p1 = Duet([x.split(" ") for x in self.getInput()], 0, q1, q2)
|
||||
p2 = Duet([x.split(" ") for x in self.getInput()], 1, q2, q1)
|
||||
p1.daemon = True
|
||||
p2.daemon = True
|
||||
p1.start()
|
||||
p2.start()
|
||||
|
||||
while p1.is_alive() or p2.is_alive():
|
||||
if (p1.state == 1 and q1.empty()) and (p2.state == 1 and q2.empty()):
|
||||
return p2.output
|
||||
time.sleep(0.01)
|
||||
|
||||
return p2.output
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
day = Day(2017, 18)
|
||||
day.run(verbose=True)
|
||||
41
inputs/input18
Normal file
41
inputs/input18
Normal file
@ -0,0 +1,41 @@
|
||||
set i 31
|
||||
set a 1
|
||||
mul p 17
|
||||
jgz p p
|
||||
mul a 2
|
||||
add i -1
|
||||
jgz i -2
|
||||
add a -1
|
||||
set i 127
|
||||
set p 826
|
||||
mul p 8505
|
||||
mod p a
|
||||
mul p 129749
|
||||
add p 12345
|
||||
mod p a
|
||||
set b p
|
||||
mod b 10000
|
||||
snd b
|
||||
add i -1
|
||||
jgz i -9
|
||||
jgz a 3
|
||||
rcv b
|
||||
jgz b -1
|
||||
set f 0
|
||||
set i 126
|
||||
rcv a
|
||||
rcv b
|
||||
set p a
|
||||
mul p -1
|
||||
add p b
|
||||
jgz p 4
|
||||
snd a
|
||||
set a b
|
||||
jgz 1 3
|
||||
snd b
|
||||
set f 1
|
||||
add i -1
|
||||
jgz i -11
|
||||
snd a
|
||||
jgz f -16
|
||||
jgz a -19
|
||||
10
inputs/input18_test
Normal file
10
inputs/input18_test
Normal file
@ -0,0 +1,10 @@
|
||||
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
|
||||
7
inputs/input18_test2
Normal file
7
inputs/input18_test2
Normal file
@ -0,0 +1,7 @@
|
||||
snd 1
|
||||
snd 2
|
||||
snd p
|
||||
rcv a
|
||||
rcv b
|
||||
rcv c
|
||||
rcv d
|
||||
Loading…
Reference in New Issue
Block a user