|
|
@@ -1,44 +1,8 @@
|
|
|
#!/usr/bin/env python3
|
|
|
import sys
|
|
|
from itertools import islice
|
|
|
-from operator import add, mul, lt, eq
|
|
|
from time import sleep
|
|
|
-
|
|
|
-def run(p, get_input, memsize=0):
|
|
|
- def decode_param(offset):
|
|
|
- return p[pc + offset], modes // (10 ** (offset - 1)) % 10
|
|
|
-
|
|
|
- def pload(offset):
|
|
|
- param, mode = decode_param(offset)
|
|
|
- return param if mode == 1 else p[param + relbase * mode // 2]
|
|
|
-
|
|
|
- def pstore(offset, value):
|
|
|
- param, mode = decode_param(offset)
|
|
|
- p[param + relbase * mode // 2] = value
|
|
|
-
|
|
|
- opmap = {1: add, 2: mul, 7: lt, 8: eq}
|
|
|
- p = p + [0] * memsize
|
|
|
- pc = relbase = 0
|
|
|
-
|
|
|
- while p[pc] != 99:
|
|
|
- modes, opcode = divmod(p[pc], 100)
|
|
|
-
|
|
|
- if opcode in (1, 2, 7, 8):
|
|
|
- pstore(3, opmap[opcode](pload(1), pload(2)))
|
|
|
- pc += 4
|
|
|
- elif opcode == 3:
|
|
|
- pstore(1, get_input())
|
|
|
- pc += 2
|
|
|
- elif opcode == 4:
|
|
|
- yield pload(1)
|
|
|
- pc += 2
|
|
|
- elif opcode == 5:
|
|
|
- pc = pload(2) if pload(1) else pc + 3
|
|
|
- elif opcode == 6:
|
|
|
- pc = pload(2) if not pload(1) else pc + 3
|
|
|
- elif opcode == 9:
|
|
|
- relbase += pload(1)
|
|
|
- pc += 2
|
|
|
+from intcode import read_program, run
|
|
|
|
|
|
def makegrid(game):
|
|
|
x, y, ident = islice(game, 3)
|
|
|
@@ -65,7 +29,6 @@ def draw(grid, score):
|
|
|
def play(code, verbose):
|
|
|
game = run(code, lambda: xball - xpaddle, 1000)
|
|
|
grid, score = makegrid(game)
|
|
|
- ypaddle = next(y for y, row in enumerate(grid) if 3 in row)
|
|
|
xpaddle = xball = 0
|
|
|
if verbose:
|
|
|
draw(grid, score)
|
|
|
@@ -87,7 +50,7 @@ def play(code, verbose):
|
|
|
return score
|
|
|
|
|
|
# part 1
|
|
|
-code = list(map(int, sys.stdin.read().split(',')))
|
|
|
+code = read_program(sys.stdin)
|
|
|
outp = list(run(code, lambda: 0, 1000))
|
|
|
print(outp[2::3].count(2))
|
|
|
|