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()