advent-of-code/2019-python/output/day_07.py

77 lines
1.9 KiB
Python

from collections import defaultdict
from itertools import permutations
from output import answer
from output.intcode_computer import execute, parse
n = 7
title = "Amplification Circuit"
@answer(
1,
"[intcode 0.3.0] The highest achievable signal to the thruster is {}",
)
def part_1(o):
return o[0]
@answer(
2,
"[intcode 0.3.0] By creating a feedback loop, the highest achievable signal to the thruster is {}",
)
def part_2(o):
return o[0]
def solve(data):
program = parse(data)
thruster_signals = []
for settings in map(list, permutations(range(5))):
o = 0
for ps in settings:
_code, _state, _n, _rb, so = execute(program, stdin=[ps, o])
o = so.pop(0)
thruster_signals.append(o)
p1 = max(thruster_signals)
thruster_signals = []
for settings in map(list, permutations(range(5, 10))):
o = [0]
finished = set()
paused = defaultdict(tuple)
while len(finished) < 5:
for amp, ps in enumerate(settings):
if paused[amp]:
program, resume_at = paused[amp]
del paused[amp]
code, state, n, _rb, so = execute(program, stdin=o, n=resume_at)
else:
code, state, n, _rb, so = execute(program, stdin=[ps, *o])
if code == 3:
paused[amp] = (
list(state.values()),
n,
)
o = so
if code == 99:
finished.add(amp)
o = so
thruster_signals.append(o[-1])
p2 = max(thruster_signals)
return p1, p2
if __name__ == "__main__":
with open("./input/07.txt", "r") as f:
inp = f.read().strip()
inp = solve(inp)
a = part_1(inp)
b = part_2(inp)
assert a == 398674
assert b == 39431233