My Advent of Code solutions in Python. kevinyap.ca/2019/12/going-fast-in-advent-of-code/
advent-of-code python
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Update day09.py

+33 -36
+33 -36
2019/day09.py
··· 1 1 import fileinput 2 2 3 3 4 + # True = read, False = write 5 + INSTRUCTIONS = { 6 + 1: (True, True, False), 7 + 2: (True, True, False), 8 + 3: (False, None, None), 9 + 4: (True, None, None), 10 + 5: (True, True, None), 11 + 6: (True, True, None), 12 + 7: (True, True, False), 13 + 8: (True, True, False), 14 + 9: (True, None, None), 15 + 99: (None, None, None) 16 + } 17 + 18 + 4 19 GLOBAL_INPUTS = [0] 5 20 6 21 ··· 18 33 outs = [] 19 34 relative_base = 0 20 35 21 - def resolve_modes(a, b, c, mode_a, mode_b, mode_c): 36 + def resolve_modes(op, params, modes): 22 37 res = [a, b, c] 23 - try: 24 - if mode_a == 0: 25 - res[0] = tape[a] 26 - elif mode_a == 1: 27 - res[0] = a 28 - elif mode_a == 2: 29 - res[0] = tape[relative_base + a] 30 - except e: 31 - pass 32 38 33 - try: 34 - if mode_b == 0: 35 - res[1] = tape[b] 36 - elif mode_b == 1: 37 - res[1] = b 38 - elif mode_b == 2: 39 - res[1] = tape[relative_base + b] 40 - except e: 41 - pass 39 + for i, (is_read, p, m) in enumerate(zip(INSTRUCTIONS[op], params, modes)): 40 + if is_read is None: 41 + continue 42 42 43 - # Third param always output, instruction handles indirection 44 - try: 45 - if mode_c == 0: 46 - res[2] = c 47 - elif mode_c == 2: 48 - res[2] = relative_base + c 49 - except e: 50 - pass 43 + if is_read: 44 + if m == 0: 45 + res[i] = tape[p] 46 + elif m == 1: 47 + res[i] = p 48 + elif m == 2: 49 + res[i] = tape[relative_base + p] 50 + else: 51 + if m == 0: 52 + res[i] = p 53 + elif m == 2: 54 + res[i] = relative_base + p 51 55 52 56 return res 53 57 54 58 while pc < len(tape): 55 59 mode_op, a, b, c = tape[pc:pc+4] 56 60 op, mode_a, mode_b, mode_c = parse_mode(tape, mode_op, a, b, c) 57 - 58 - # INP uses first param to determine indirection, special case 59 - if op != 3: 60 - a, b, c = resolve_modes(a, b, c, mode_a, mode_b, mode_c) 61 + a, b, c = resolve_modes(op, (a, b, c), (mode_a, mode_b, mode_c)) 61 62 62 63 # ADD a b c 63 64 if op == 1: ··· 71 72 72 73 # INP a 73 74 elif op == 3: 74 - if mode_a == 0: 75 - tape[a] = GLOBAL_INPUTS[pid] 76 - elif mode_a == 2: 77 - tape[relative_base + a] = GLOBAL_INPUTS[pid] 78 - 75 + tape[a] = GLOBAL_INPUTS[pid] 79 76 pc += 2 80 77 81 78 # OUT b