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)) |