diff --git a/day_7/input.txt b/day_7/input.txt
index 74d32f019010bb764ba027ec0395593b7a4de181..6a79c0780a1ef15a08f5c3b1393e68495bf3d51c 100644
--- a/day_7/input.txt
+++ b/day_7/input.txt
@@ -1,4 +1,5 @@
 3,8,1001,8,10,8,105,1,0,0,21,34,51,76,101,114,195,276,357,438,99999,3,9,1001,9,3,9,1002,9,3,9,4,9,99,3,9,101,4,9,9,102,4,9,9,1001,9,5,9,4,9,99,3,9,1002,9,4,9,101,3,9,9,102,5,9,9,1001,9,2,9,1002,9,2,9,4,9,99,3,9,1001,9,3,9,102,2,9,9,101,4,9,9,102,3,9,9,101,2,9,9,4,9,99,3,9,102,2,9,9,101,4,9,9,4,9,99,3,9,102,2,9,9,4,9,3,9,102,2,9,9,4,9,3,9,1001,9,1,9,4,9,3,9,1001,9,2,9,4,9,3,9,101,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,1001,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,101,2,9,9,4,9,99,3,9,101,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,1001,9,1,9,4,9,3,9,1001,9,1,9,4,9,3,9,1002,9,2,9,4,9,3,9,102,2,9,9,4,9,3,9,101,1,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,1001,9,2,9,4,9,3,9,1001,9,2,9,4,9,99,3,9,1001,9,2,9,4,9,3,9,102,2,9,9,4,9,3,9,101,2,9,9,4,9,3,9,102,2,9,9,4,9,3,9,1001,9,1,9,4,9,3,9,102,2,9,9,4,9,3,9,1001,9,1,9,4,9,3,9,102,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,101,2,9,9,4,9,99,3,9,102,2,9,9,4,9,3,9,102,2,9,9,4,9,3,9,1002,9,2,9,4,9,3,9,1001,9,1,9,4,9,3,9,1002,9,2,9,4,9,3,9,102,2,9,9,4,9,3,9,1001,9,2,9,4,9,3,9,101,1,9,9,4,9,3,9,102,2,9,9,4,9,3,9,102,2,9,9,4,9,99,3,9,1002,9,2,9,4,9,3,9,101,2,9,9,4,9,3,9,101,1,9,9,4,9,3,9,101,2,9,9,4,9,3,9,101,1,9,9,4,9,3,9,1001,9,2,9,4,9,3,9,1002,9,2,9,4,9,3,9,1001,9,1,9,4,9,3,9,1001,9,2,9,4,9,3,9,1002,9,2,9,4,9,99
-3,31,3,32,1002,32,10,32,1001,31,-2,31,1007,31,0,33, 1002,33,7,33,1,33,31,31,1,32,31,31,4,31,99,0,0,0
-3,23,3,24,1002,24,10,24,1002,23,-1,23, 101,5,23,23,1,24,23,23,4,23,99,0,0
-3,15,3,16,1002,16,10,16,1,16,15,15,4,15,99,0,0
+
+3,52,1001,52,-5,52,3,53,1,52,56,54,1007,54,5,55,1005,55,26,1001,54, -5,54,1105,1,12,1,53,54,53,1008,54,0,55,1001,55,1,55,2,53,55,53,4, 53,1001,56,-1,56,1005,56,6,99,0,0,0,0,10
+
+3,26,1001,26,-4,26,3,27,1002,27,2,27,1,27,26, 27,4,27,1001,28,-1,28,1005,28,6,99,0,0,5
diff --git a/day_7/main.py b/day_7/main.py
index f551d04559e1101b1ecf44a06c49cc78acbbf568..75dbaa9d553c313474cdb6ae05b14e47b7fc7d79 100644
--- a/day_7/main.py
+++ b/day_7/main.py
@@ -2,6 +2,7 @@
 
 from itertools import permutations
 
+
 def get_codes():
     with open("input.txt") as f:
         return [int(num) for num in f.readline().strip().split(",")]
@@ -40,73 +41,93 @@ def get_next_command(ip, codes):
     return ip, op, params
 
 
-def exec_command(ip, op, params, codes, inputs, output):
-    if op == 1:                            # add
+def exec_command(ip, op, params, codes, inputs, outputs):
+    if op == 1:  # add
         codes[params[2]] = params[0] + params[1]
-    elif op == 2:                          # multiply
+    elif op == 2:  # multiply
         codes[params[2]] = params[0] * params[1]
-    elif op == 3:                          # inout
+    elif op == 3:  # inout
         # val = int(input("Enter input val? "))
         val = inputs.pop(0)
         codes[params[0]] = val
-    elif op == 4:                          # output
+        # print(f"Input value = ({val})")
+    elif op == 4:  # output
         # print(f"Output value = ({params[0]})")
-        output = params[0]
-    elif op == 5:                          # branch true
+        outputs.append(params[0])
+    elif op == 5:  # branch true
         if params[0] != 0:
             ip = params[1]
-    elif op == 6:                          # branch false
+    elif op == 6:  # branch false
         if params[0] == 0:
             ip = params[1]
-    elif op == 7:                          # less than
+    elif op == 7:  # less than
         if params[0] < params[1]:
             codes[params[2]] = 1
         else:
             codes[params[2]] = 0
-    elif op == 8:                          # equals
+    elif op == 8:  # equals
         if params[0] == params[1]:
             codes[params[2]] = 1
         else:
             codes[params[2]] = 0
-    elif op == 99:                         # halt
+    elif op == 99:  # halt
+        outputs.append(-1)
         ip = -1
     else:
         print(f"Bad Op Code {op}")
         ip = -1
 
-    return ip, output
+    return ip
+
+
+class Amp:
+    def __init__(self):
+        self.codes = get_codes()
+        self.ip = 0
 
+    def run(self, inputs):
+        while self.ip != -1:
+            self.ip, op, params = get_next_command(self.ip, self.codes)
+            outputs = []
+            self.ip = exec_command(self.ip, op, params, self.codes, inputs, outputs)
+            if len(outputs):
+                return outputs[0]
 
-def run_program(codes, inputs, output):
-    ip = 0
-    while ip != -1:
-        ip, op, params = get_next_command(ip, codes)
-        ip, output = exec_command(ip, op, params, codes, inputs, output)
-    return output
 
 def main():
     """Drive the program."""
-    inputs = list(permutations(range(5)))
-
-    # inputs = [(2,0,3, 0, 1,0,0,0,4,0)]
-    # print (inputs[:10])
-    # return
-    max = -1
-    sig = []
-    seq = []
+    inputs = list(permutations(range(5, 10)))
+
+    signal = -1
+    l_series = None
     for series in inputs:
-        output = 0
-        l = iter(series)
-        out = []
-        for _ in range(5):
-            codes = get_codes()
-            output = run_program(codes, [next(l), output], output)
-
-        if output > max:
-            max = output
-            sig = series
-            seq = output
-    print(f'Max({max}), Signal({sig}) Out({seq})')
+
+        amp_a = Amp()
+        amp_b = Amp()
+        amp_c = Amp()
+        amp_d = Amp()
+        amp_e = Amp()
+
+        output = amp_a.run([series[0], 0])
+        output = amp_b.run([series[1], output])
+        output = amp_c.run([series[2], output])
+        output = amp_d.run([series[3], output])
+        output = amp_e.run([series[4], output])
+
+        largest = 0
+        while output != -1:
+            output = amp_a.run([output])
+            output = amp_b.run([output])
+            output = amp_c.run([output])
+            output = amp_d.run([output])
+            output = amp_e.run([output])
+            if output != -1:
+                largest = output
+        if largest > signal:
+            signal = largest
+            l_series = series
+    print(signal, l_series)
+
 
 if __name__ == "__main__":
     main()