View difference between Paste ID: 67r1ZWR9 and dN7A8Drc
SHOW: | | - or go back to the newest paste.
1
import sys
2
import collections
3
4
# usage: python3 11.1.py program-file initial-square-color
5
6
# intCode computer (generator interface, yields outputs, gets inputs from list)
7
def run(inp):
8
    initmem = list(map(int, open(sys.argv[1]).read().split(',')))
9
    mem = collections.defaultdict(lambda: 0, enumerate(initmem))
10
    pc,base = 0, 0
11
    while mem[pc] != 99:
12
        opcode = mem[pc] % 100
13
        modes = ("%05d" % mem[pc])[0:3]
14
        o1 = base if modes[2] == '2' else 0
15
        o2 = base if modes[1] == '2' else 0
16
        o3 = base if modes[0] == '2' else 0
17
        if opcode in (1,2,3,4,5,6,7,8,9):
18
            op1 = mem[pc+1] if modes[2] == '1' else mem[o1+mem[pc+1]]
19
        if opcode in (1,2,5,6,7,8):
20
            op2 = mem[pc+2] if modes[1] == '1' else mem[o2+mem[pc+2]]
21
        if opcode in (1,2): # add and mul
22
            f = {1: int.__add__, 2: int.__mul__}[opcode]
23
            mem[o3+mem[pc+3]] = f(op1,op2)
24
            pc += 4
25
        elif opcode == 3: # input
26
            mem[o1+mem[pc+1]] = inp.pop(0)
27
            pc += 2
28
        elif opcode  == 4: # output
29
            pc += 2
30
            yield op1
31
        elif opcode == 5: # jump if true
32
            pc = op2 if op1 != 0 else pc+3
33
        elif opcode == 6: # jump if false
34
            pc = op2 if op1 == 0 else pc+3
35
        elif opcode == 7: # less than
36
            mem[o3+mem[pc+3]] = 1 if op1 < op2 else 0
37
            pc += 4
38
        elif opcode == 8: # equals
39
            mem[o3+mem[pc+3]] = 1 if op1 == op2 else 0
40
            pc += 4
41
        elif opcode == 9: # set relative base
42
            base += op1 
43
            pc += 2
44
        else: raise Exception("invalid opcode %d" % opcode)
45
46
# painting robot, supports infinite grid as a dict for (x,y):color
47
pipe = list()
48
robot = run(pipe)
49
hull = collections.defaultdict(lambda: 0)
50
hull[(0,0)] = int(sys.argv[2])
51
d, x, y = 0, 0, 0
52
dirs = ((0,-1), (1,0), (0,1), (-1,0))
53
minx,maxx,miny,maxy = 0, 0, 0, 0
54
try:
55
    while True:
56
        pipe.append(hull[(x,y)])
57
        color = next(robot)
58
        turn = next(robot)
59
        hull[(x,y)] = color
60
        d = (d+1)%4 if turn == 1 else (d-1)%4
61
        dx, dy = dirs[d]
62
        x, y = x+dx, y+dy
63
        minx,maxx,miny,maxy = min(x,minx),max(x,maxx),min(y,miny),max(y,maxy)
64
except StopIteration:
65
    pass
66
67
# answer part 1
68
print(len(hull.keys()))
69-
minx = min(hull.keys(), key=lambda x: x[0])[0]
69+
70-
maxx = max(hull.keys(), key=lambda x: x[0])[0]
70+
71-
miny = min(hull.keys(), key=lambda x: x[1])[1]
71+
72-
maxy = max(hull.keys(), key=lambda x: x[1])[1]
72+
73
    if c == 1:
74
        grid[y-miny][x-minx] = '#'
75
for line in grid:
76
    print(''.join(line))