From d4d07b133cd147923a5036df0f9e9823cbc53917 Mon Sep 17 00:00:00 2001 From: Arne Wischer Date: Thu, 12 Dec 2019 18:08:21 +0100 Subject: [PATCH] Finally finished day 7b with help from the internetz --- advent.py | 1 + days/comp.py | 14 ++++++++++---- days/day2.py | 4 ++-- days/day5.py | 16 ++++++---------- days/day7.py | 37 +++++++++++++++++++++++++++---------- 5 files changed, 46 insertions(+), 26 deletions(-) diff --git a/advent.py b/advent.py index d33a4d3..4e864d7 100644 --- a/advent.py +++ b/advent.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 diff --git a/days/comp.py b/days/comp.py index 29576f3..28cd7ff 100644 --- a/days/comp.py +++ b/days/comp.py @@ -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 diff --git a/days/day2.py b/days/day2.py index 7280505..4655df0 100644 --- a/days/day2.py +++ b/days/day2.py @@ -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) diff --git a/days/day5.py b/days/day5.py index 885bd66..a6e789e 100644 --- a/days/day5.py +++ b/days/day5.py @@ -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) diff --git a/days/day7.py b/days/day7.py index 4e921c7..2ecbd3b 100644 --- a/days/day7.py +++ b/days/day7.py @@ -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)