Finally finished day 7b with help from the internetz

master
Arne Wischer 6 years ago
parent cdb50936f3
commit d4d07b133c
  1. 1
      advent.py
  2. 14
      days/comp.py
  3. 4
      days/day2.py
  4. 16
      days/day5.py
  5. 37
      days/day7.py

@ -17,6 +17,7 @@ def suite():
suite.addTest(Day6('test_day6a'))
suite.addTest(Day6('test_day6b'))
suite.addTest(Day7('test_day7a'))
suite.addTest(Day7('test_day7b'))
return suite

@ -1,4 +1,4 @@
from typing import List, Tuple, Any
from typing import List, Tuple, Iterator
class OpcodeComputer():
@ -14,6 +14,7 @@ class OpcodeComputer():
https://adventofcode.com/2019/day/5
"""
__last_result: int = 0
memory = []
def __init__(self, mem: List[int]) -> None:
@ -42,7 +43,8 @@ class OpcodeComputer():
pass
return (int(i[-2:]), a, b, c)
def process_op(self, inp: List[int] = [], outp: List[Any] = []) -> int:
def process_op(self, inp: List[int] = [])\
-> Iterator[str]:
"""Run program code
Args:
@ -67,7 +69,7 @@ class OpcodeComputer():
mem[mem[pc+1]] = int(inp.pop(0))
pc += 2
elif cmd == 4:
outp.append(str(a))
yield str(a)
pc += 2
elif cmd == 5:
pc = b if a != 0 else pc + 3
@ -80,4 +82,8 @@ class OpcodeComputer():
mem[mem[pc+3]] = 1 if a == b else 0
pc += 4
cmd = mem[pc]
return mem[0]
self.__last_result = mem[0]
def process_all(self) -> int:
list(self.process_op())
return self.__last_result

@ -12,7 +12,7 @@ class Day2(unittest.TestCase):
code: List[int] = [int(k) for k in fp.readline().split(',')]
code[1] = 12
code[2] = 2
self.assertEqual(OpcodeComputer(code).process_op(), 5098658)
self.assertEqual(OpcodeComputer(code).process_all(), 5098658)
def test_day2b(self):
with open(self.inputfile) as fp:
@ -24,7 +24,7 @@ class Day2(unittest.TestCase):
code[1] = a
code[2] = b
result = OpcodeComputer(code).process_op()
result = OpcodeComputer(code).process_all()
if result == 19690720:
break
self.assertEqual(100 * a + b, 5064)

@ -1,6 +1,6 @@
import unittest
import os
from . import comp
from .comp import OpcodeComputer
class Day5(unittest.TestCase):
@ -10,17 +10,13 @@ class Day5(unittest.TestCase):
return [int(k) for k in fp.readline().split(',')]
def test_day5a(self):
outp = []
sut = OpcodeComputer(self.get_code())
sut = comp.OpcodeComputer(self.get_code())
sut.process_op([1], outp)
outp = list(sut.process_op([1]))
self.assertEqual(int(outp[-1]), 8332629)
def test_day5b(self):
outp = []
sut = comp.OpcodeComputer(self.get_code())
sut = OpcodeComputer(self.get_code())
sut.process_op([5], outp)
self.assertEqual(int(outp[-1]), 8805067)
outp = list(sut.process_op([5]))
self.assertEqual(int(outp[0]), 8805067)

@ -1,6 +1,6 @@
import unittest
import os
from . import comp
from .comp import OpcodeComputer
import itertools
@ -11,20 +11,37 @@ class Day7(unittest.TestCase):
return [int(k) for k in fp.readline().split(',')]
def test_day7a(self):
com = comp.OpcodeComputer(self.get_code())
com = OpcodeComputer(self.get_code())
configs = itertools.permutations(range(5), 5)
res = 0
out = []
res: int = 0
for conf in configs:
sig = 0
sig: int = 0
for phase in conf:
out.clear()
com.process_op([phase, sig], out)
sig = out[0]
res = int(out[0]) if int(out[0]) > res else res
sig = int(list(com.process_op([phase, sig]))[0])
res = sig if sig > res else res
self.assertEqual(res, 21000)
def test_day7b(self):
pass
"""
Shoutout to OverjoyedBanana for his helpful solution
https://www.reddit.com/r/adventofcode/comments/e7om28/2019_day_7_part_2_python3_help_with/fa3bh4w/
https://pastebin.com/cyLTHUYV
"""
com = OpcodeComputer(self.get_code())
res: int = 0
for config in itertools.permutations(range(5, 10), 5):
sig: int = 0
buffer = [[conf] for conf in config]
comps = list(map(com.process_op, buffer))
try:
while True:
for i in range(5):
buffer[i].append(sig)
sig = int(next(comps[i]))
except StopIteration:
pass
res = sig if sig > res else res
self.assertEqual(res, 61379886)

Loading…
Cancel
Save