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.

Add solution for 2018/21

+103
+69
2018/day21.py
··· 1 + import fileinput 2 + 3 + 4 + def emulate(program, ip_reg): 5 + """ 6 + Emulate the program while watching register 1, as this program is a 7 + PRNG that will terminate if regs[0] == regs[1] at instruction 28. 8 + """ 9 + pc = 0 10 + regs = [0, 0, 0, 0, 0, 0] 11 + 12 + seen = set() 13 + first_halt = None 14 + last_halt = None 15 + 16 + while 0 <= pc < len(program): 17 + cmd, a, b, c = program[pc] 18 + regs[ip_reg] = pc 19 + 20 + if cmd == 'addr': regs[c] = regs[a] + regs[b] 21 + elif cmd == 'addi': regs[c] = regs[a] + b 22 + elif cmd == 'mulr': regs[c] = regs[a] * regs[b] 23 + elif cmd == 'muli': regs[c] = regs[a] * b 24 + elif cmd == 'banr': regs[c] = regs[a] & regs[b] 25 + elif cmd == 'bani': regs[c] = regs[a] & b 26 + elif cmd == 'borr': regs[c] = regs[a] | regs[b] 27 + elif cmd == 'bori': regs[c] = regs[a] | b 28 + elif cmd == 'setr': regs[c] = regs[a] 29 + elif cmd == 'seti': regs[c] = a 30 + elif cmd == 'gtir': regs[c] = int(a > regs[b]) 31 + elif cmd == 'gtri': regs[c] = int(regs[a] > b) 32 + elif cmd == 'gtrr': regs[c] = int(regs[a] > regs[b]) 33 + elif cmd == 'eqir': regs[c] = int(a == regs[b]) 34 + elif cmd == 'eqri': regs[c] = int(regs[a] == b) 35 + elif cmd == 'eqrr': regs[c] = int(regs[a] == regs[b]) 36 + 37 + # This is where the program checks to break and halt, so 38 + # take note of whatever value is in register 1. 39 + if pc == 28: 40 + if first_halt is None: 41 + first_halt = regs[1] 42 + elif regs[1] in seen: 43 + break 44 + else: 45 + last_halt = regs[1] 46 + seen.add(regs[1]) 47 + 48 + pc = regs[ip_reg] 49 + pc += 1 50 + 51 + return first_halt, last_halt 52 + 53 + 54 + PROGRAM = [] 55 + IP = None 56 + 57 + for line in fileinput.input(): 58 + parts = line.split() 59 + 60 + if fileinput.isfirstline(): 61 + IP = int(parts[1]) 62 + else: 63 + a, b, c = [int(x) for x in parts[1:4]] 64 + PROGRAM.append((parts[0], a, b, c)) 65 + 66 + first_halt, last_halt = emulate(PROGRAM, IP) 67 + 68 + print "Lowest value for register 0 with fewest cycles:", first_halt 69 + print "Lowest value for register 0 with the most cycles:", last_halt
+32
2018/inputs/21.txt
··· 1 + #ip 4 2 + seti 123 0 1 3 + bani 1 456 1 4 + eqri 1 72 1 5 + addr 1 4 4 6 + seti 0 0 4 7 + seti 0 3 1 8 + bori 1 65536 5 9 + seti 8586263 3 1 10 + bani 5 255 2 11 + addr 1 2 1 12 + bani 1 16777215 1 13 + muli 1 65899 1 14 + bani 1 16777215 1 15 + gtir 256 5 2 16 + addr 2 4 4 17 + addi 4 1 4 18 + seti 27 8 4 19 + seti 0 1 2 20 + addi 2 1 3 21 + muli 3 256 3 22 + gtrr 3 5 3 23 + addr 3 4 4 24 + addi 4 1 4 25 + seti 25 8 4 26 + addi 2 1 2 27 + seti 17 7 4 28 + setr 2 0 5 29 + seti 7 8 4 30 + eqrr 1 0 2 31 + addr 2 4 4 32 + seti 5 4 4
+2
2018/outputs/21.txt
··· 1 + 5970144 2 + 13943296