diff --git a/day_5/input.txt b/day_5/input.txt index 9fa69f3d9f126c7d80412a78ff8b7359c7b4d06f..04bbec485afd8ecd583fcb4b9aa21c39afbf2cb3 100644 --- a/day_5/input.txt +++ b/day_5/input.txt @@ -1 +1 @@ -3,9,8,9,10,9,4,9,99,-1,8,99,9999,3,225,1,225,6,6,1100,1,238,225,104,0,1101,72,36,225,1101,87,26,225,2,144,13,224,101,-1872,224,224,4,224,102,8,223,223,1001,224,2,224,1,223,224,223,1102,66,61,225,1102,25,49,224,101,-1225,224,224,4,224,1002,223,8,223,1001,224,5,224,1,223,224,223,1101,35,77,224,101,-112,224,224,4,224,102,8,223,223,1001,224,2,224,1,223,224,223,1002,195,30,224,1001,224,-2550,224,4,224,1002,223,8,223,1001,224,1,224,1,224,223,223,1102,30,44,225,1102,24,21,225,1,170,117,224,101,-46,224,224,4,224,1002,223,8,223,101,5,224,224,1,224,223,223,1102,63,26,225,102,74,114,224,1001,224,-3256,224,4,224,102,8,223,223,1001,224,3,224,1,224,223,223,1101,58,22,225,101,13,17,224,101,-100,224,224,4,224,1002,223,8,223,101,6,224,224,1,224,223,223,1101,85,18,225,1001,44,7,224,101,-68,224,224,4,224,102,8,223,223,1001,224,5,224,1,223,224,223,4,223,99,0,0,0,677,0,0,0,0,0,0,0,0,0,0,0,1105,0,99999,1105,227,247,1105,1,99999,1005,227,99999,1005,0,256,1105,1,99999,1106,227,99999,1106,0,265,1105,1,99999,1006,0,99999,1006,227,274,1105,1,99999,1105,1,280,1105,1,99999,1,225,225,225,1101,294,0,0,105,1,0,1105,1,99999,1106,0,300,1105,1,99999,1,225,225,225,1101,314,0,0,106,0,0,1105,1,99999,7,677,226,224,102,2,223,223,1005,224,329,101,1,223,223,8,677,226,224,1002,223,2,223,1005,224,344,1001,223,1,223,1107,677,677,224,102,2,223,223,1005,224,359,1001,223,1,223,1107,226,677,224,102,2,223,223,1005,224,374,101,1,223,223,7,226,677,224,102,2,223,223,1005,224,389,101,1,223,223,8,226,677,224,1002,223,2,223,1005,224,404,101,1,223,223,1008,226,677,224,1002,223,2,223,1005,224,419,1001,223,1,223,107,677,677,224,102,2,223,223,1005,224,434,101,1,223,223,1108,677,226,224,1002,223,2,223,1006,224,449,101,1,223,223,1108,677,677,224,102,2,223,223,1006,224,464,101,1,223,223,1007,677,226,224,102,2,223,223,1006,224,479,101,1,223,223,1008,226,226,224,102,2,223,223,1006,224,494,101,1,223,223,108,226,226,224,1002,223,2,223,1006,224,509,101,1,223,223,107,226,226,224,102,2,223,223,1006,224,524,101,1,223,223,1107,677,226,224,102,2,223,223,1005,224,539,1001,223,1,223,108,226,677,224,1002,223,2,223,1005,224,554,101,1,223,223,1007,226,226,224,102,2,223,223,1005,224,569,101,1,223,223,8,226,226,224,102,2,223,223,1006,224,584,101,1,223,223,1008,677,677,224,1002,223,2,223,1005,224,599,1001,223,1,223,107,226,677,224,1002,223,2,223,1005,224,614,1001,223,1,223,1108,226,677,224,102,2,223,223,1006,224,629,101,1,223,223,7,677,677,224,1002,223,2,223,1005,224,644,1001,223,1,223,108,677,677,224,102,2,223,223,1005,224,659,101,1,223,223,1007,677,677,224,102,2,223,223,1006,224,674,101,1,223,223,4,223,99,226 +3,225,1,225,6,6,1100,1,238,225,104,0,1101,72,36,225,1101,87,26,225,2,144,13,224,101,-1872,224,224,4,224,102,8,223,223,1001,224,2,224,1,223,224,223,1102,66,61,225,1102,25,49,224,101,-1225,224,224,4,224,1002,223,8,223,1001,224,5,224,1,223,224,223,1101,35,77,224,101,-112,224,224,4,224,102,8,223,223,1001,224,2,224,1,223,224,223,1002,195,30,224,1001,224,-2550,224,4,224,1002,223,8,223,1001,224,1,224,1,224,223,223,1102,30,44,225,1102,24,21,225,1,170,117,224,101,-46,224,224,4,224,1002,223,8,223,101,5,224,224,1,224,223,223,1102,63,26,225,102,74,114,224,1001,224,-3256,224,4,224,102,8,223,223,1001,224,3,224,1,224,223,223,1101,58,22,225,101,13,17,224,101,-100,224,224,4,224,1002,223,8,223,101,6,224,224,1,224,223,223,1101,85,18,225,1001,44,7,224,101,-68,224,224,4,224,102,8,223,223,1001,224,5,224,1,223,224,223,4,223,99,0,0,0,677,0,0,0,0,0,0,0,0,0,0,0,1105,0,99999,1105,227,247,1105,1,99999,1005,227,99999,1005,0,256,1105,1,99999,1106,227,99999,1106,0,265,1105,1,99999,1006,0,99999,1006,227,274,1105,1,99999,1105,1,280,1105,1,99999,1,225,225,225,1101,294,0,0,105,1,0,1105,1,99999,1106,0,300,1105,1,99999,1,225,225,225,1101,314,0,0,106,0,0,1105,1,99999,7,677,226,224,102,2,223,223,1005,224,329,101,1,223,223,8,677,226,224,1002,223,2,223,1005,224,344,1001,223,1,223,1107,677,677,224,102,2,223,223,1005,224,359,1001,223,1,223,1107,226,677,224,102,2,223,223,1005,224,374,101,1,223,223,7,226,677,224,102,2,223,223,1005,224,389,101,1,223,223,8,226,677,224,1002,223,2,223,1005,224,404,101,1,223,223,1008,226,677,224,1002,223,2,223,1005,224,419,1001,223,1,223,107,677,677,224,102,2,223,223,1005,224,434,101,1,223,223,1108,677,226,224,1002,223,2,223,1006,224,449,101,1,223,223,1108,677,677,224,102,2,223,223,1006,224,464,101,1,223,223,1007,677,226,224,102,2,223,223,1006,224,479,101,1,223,223,1008,226,226,224,102,2,223,223,1006,224,494,101,1,223,223,108,226,226,224,1002,223,2,223,1006,224,509,101,1,223,223,107,226,226,224,102,2,223,223,1006,224,524,101,1,223,223,1107,677,226,224,102,2,223,223,1005,224,539,1001,223,1,223,108,226,677,224,1002,223,2,223,1005,224,554,101,1,223,223,1007,226,226,224,102,2,223,223,1005,224,569,101,1,223,223,8,226,226,224,102,2,223,223,1006,224,584,101,1,223,223,1008,677,677,224,1002,223,2,223,1005,224,599,1001,223,1,223,107,226,677,224,1002,223,2,223,1005,224,614,1001,223,1,223,1108,226,677,224,102,2,223,223,1006,224,629,101,1,223,223,7,677,677,224,1002,223,2,223,1005,224,644,1001,223,1,223,108,677,677,224,102,2,223,223,1005,224,659,101,1,223,223,1007,677,677,224,102,2,223,223,1006,224,674,101,1,223,223,4,223,99,226 diff --git a/day_5/main.py b/day_5/main.py index 7c5dae98cd1559432b08353d6f23fd96dde25a00..5ec20e47d3256e61229f490503a21fe2449df8d9 100644 --- a/day_5/main.py +++ b/day_5/main.py @@ -1,10 +1,9 @@ -"""1202 Program Alarm.""" -import itertools +"""Day 5: Sunny with a Chance of Asteroids.""" def get_codes(): - with open('input.txt') as f: - return [int(num) for num in f.readline().strip().split(',')] + with open("input.txt") as f: + return [int(num) for num in f.readline().strip().split(",")] def get_opcode(opcode): @@ -17,19 +16,6 @@ def get_opcode(opcode): tmp //= 10 t = tmp % 10 - return h, k, t, op - - -def get_opcode2(opcode): - tmp = int(opcode) - op = tmp % 100 - tmp //= 100 - h = tmp % 10 - tmp //= 10 - k = tmp % 10 - tmp //= 10 - t = tmp % 10 - if op in (1, 2, 7, 8): t = 1 if op in (3,): @@ -38,32 +24,11 @@ def get_opcode2(opcode): return (h, k, t), op -def op_get_size(op): - if op == 1: - return 4 - if op == 2: - return 4 - if op == 3: - return 2 - if op == 4: - return 2 - if op == 5: - return 3 - if op == 6: - return 3 - if op == 7: - return 4 - if op == 8: - return 4 - if op == 99: - return 1 - - def get_next_command(ip, codes): - parm_counts = {1:3, 2:3, 3:1, 4:1, 5:2, 6:2, 7:3, 8:3, 99:0} - modes, op = get_opcode2(codes[ip]) + parm_counts = {1: 3, 2: 3, 3: 1, 4: 1, 5: 2, 6: 2, 7: 3, 8: 3, 99: 0} + modes, op = get_opcode(codes[ip]) - params = [0,0,0] + params = [0, 0, 0] ip += 1 for x in range(parm_counts[op]): params[x] = codes[ip] @@ -71,38 +36,39 @@ def get_next_command(ip, codes): params[x] = codes[params[x]] ip += 1 - return ip, op, params def exec_command(ip, op, params, codes): - if op == 1: + if op == 1: # add codes[params[2]] = params[0] + params[1] - elif op == 2: + elif op == 2: # multiply codes[params[2]] = params[0] * params[1] - elif op == 3: - val = int(input('Enter input val? ')) + elif op == 3: # inout + val = int(input("Enter input val? ")) codes[params[0]] = val - elif op == 4: - print(f'Output value = ({params[0]})') - elif op == 5: + elif op == 4: # output + print(f"Output value = ({params[0]})") + elif op == 5: # branch true if params[0] != 0: ip = params[1] - elif op == 6: + elif op == 6: # branch false if params[0] == 0: ip = params[1] - elif op == 7: + elif op == 7: # less than if params[0] < params[1]: - params[2] = 1 - elif op == 8: + codes[params[2]] = 1 + else: + codes[params[2]] = 0 + elif op == 8: # equals if params[0] == params[1]: - params[2] = 1 + codes[params[2]] = 1 else: - params[2] = 0 - elif op == 99: + codes[params[2]] = 0 + elif op == 99: # halt ip = -1 else: - print(f'Bad Op Code {op}') + print(f"Bad Op Code {op}") ip = -1 return ip @@ -115,55 +81,9 @@ def run_program(codes): ip = exec_command(ip, op, params, codes) -def run_computer(codes): - ip = 0 - while codes[ip] != 99: - p1_mode, p2_mode, p3_mode, op = get_opcode(codes[ip+0]) - # print(p1_mode, p2_mode, p3_mode, op) - size = op_get_size(op) - if size == 1: - pass - - parm1 = codes[ip+1] - outpt = parm1 - if p1_mode == 0: - parm1 = codes[parm1] - - if size == 4: - parm2 = codes[ip+2] - if p2_mode == 0: - parm2 = codes[parm2] - - outpt = codes[ip+3] - - if op == 1: - codes[outpt] = parm1 + parm2 - elif op == 2: - codes[outpt] = parm1 * parm2 - elif op == 3: - val = int(input('Enter input val? ')) - codes[outpt] = val - elif op == 4: - print(f'Output value = ({parm1})') - else: - print(f'Bad Op Code {op}') - break - ip += size - - -def main2(): - """Drive the program.""" - codes = get_codes() - - new_codes = [code for code in codes] - - run_computer(new_codes) - - def main(): """Drive the program.""" codes = get_codes() - run_program(codes)