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/19

+99
+60
2018/day19.py
··· 1 + import fileinput 2 + from utils import factors 3 + 4 + 5 + def emulate(program, ip_reg, start=0, cheat=False): 6 + """ 7 + Emulate the program to load in the value we're solving for. 8 + 9 + Instruction 0 immediately jumps to 17 to begin the loading 10 + procedure; when we get back to instruction 1, register 1 11 + already contains the target number. 12 + """ 13 + ip = 0 14 + regs = [start, 0, 0, 0, 0, 0] 15 + 16 + while 0 <= ip <= len(program): 17 + if ip == 1 and cheat: 18 + return sum(factors(regs[1])) 19 + 20 + cmd, a, b, c = program[ip] 21 + regs[ip_reg] = ip 22 + 23 + if cmd == 'addr': regs[c] = regs[a] + regs[b] 24 + elif cmd == 'addi': regs[c] = regs[a] + b 25 + elif cmd == 'mulr': regs[c] = regs[a] * regs[b] 26 + elif cmd == 'muli': regs[c] = regs[a] * b 27 + elif cmd == 'banr': regs[c] = regs[a] & regs[b] 28 + elif cmd == 'bani': regs[c] = regs[a] & b 29 + elif cmd == 'borr': regs[c] = regs[a] | regs[b] 30 + elif cmd == 'bori': regs[c] = regs[a] | b 31 + elif cmd == 'setr': regs[c] = regs[a] 32 + elif cmd == 'seti': regs[c] = a 33 + elif cmd == 'gtir': regs[c] = int(a > regs[b]) 34 + elif cmd == 'gtri': regs[c] = int(regs[a] > b) 35 + elif cmd == 'gtrr': regs[c] = int(regs[a] > regs[b]) 36 + elif cmd == 'eqir': regs[c] = int(a == regs[b]) 37 + elif cmd == 'eqri': regs[c] = int(regs[a] == b) 38 + elif cmd == 'eqrr': regs[c] = int(regs[a] == regs[b]) 39 + 40 + ip = regs[ip_reg] 41 + ip += 1 42 + 43 + return regs[0] 44 + 45 + 46 + PROGRAM = [] 47 + IP = None 48 + 49 + for line in fileinput.input(): 50 + parts = line.split() 51 + 52 + if fileinput.isfirstline(): 53 + IP = int(parts[1]) 54 + else: 55 + a, b, c = [int(x) for x in parts[1:4]] 56 + PROGRAM.append((parts[0], a, b, c)) 57 + 58 + 59 + print "Value left in register 0 when initialized to 0:", emulate(PROGRAM, IP, start=0) 60 + print "Value left in register 0 when initialized to 1:", emulate(PROGRAM, IP, start=1, cheat=True)
+37
2018/inputs/19.txt
··· 1 + #ip 2 2 + addi 2 16 2 3 + seti 1 1 5 4 + seti 1 1 3 5 + mulr 5 3 4 6 + eqrr 4 1 4 7 + addr 4 2 2 8 + addi 2 1 2 9 + addr 5 0 0 10 + addi 3 1 3 11 + gtrr 3 1 4 12 + addr 2 4 2 13 + seti 2 8 2 14 + addi 5 1 5 15 + gtrr 5 1 4 16 + addr 4 2 2 17 + seti 1 5 2 18 + mulr 2 2 2 19 + addi 1 2 1 20 + mulr 1 1 1 21 + mulr 2 1 1 22 + muli 1 11 1 23 + addi 4 3 4 24 + mulr 4 2 4 25 + addi 4 7 4 26 + addr 1 4 1 27 + addr 2 0 2 28 + seti 0 4 2 29 + setr 2 8 4 30 + mulr 4 2 4 31 + addr 2 4 4 32 + mulr 2 4 4 33 + muli 4 14 4 34 + mulr 4 2 4 35 + addr 1 4 1 36 + seti 0 5 0 37 + seti 0 8 2
+2
2018/outputs/19.txt
··· 1 + 1326 2 + 14562240