def search(program): stack = [('', program)] grid = dict() oxygen = None while stack: sequence, p = stack.pop(0) c = coordinate(sequence) #draw(grid, X=c) # Update map grid[c] = '.' # Run sequence for d in 'NSWE': ds = sequence + d dc = coordinate(ds) if dc in grid: continue vm = Intcode(p) vm.write(CMD[d]) status = vm.run() if status == 0: grid[dc] = '#' elif status == 1: # Take new step stack.append((ds, vm.program)) elif status == 2: oxygen = ds stack.append((ds, vm.program)) else: print("bad status:", status) return grid, oxygen
def robot(): vm = Intcode(load(11)) grid = dict() di = 0 p = (0, 0) grid[p] = 1 while not vm.is_terminated(): camera = grid.get(p, 0) vm.write(camera) color = vm.run() turn_right = vm.run() if color is not None: grid[p] = color di = (di + (1 if turn_right == 1 else -1)) % len(DIRECTIONS) dx, dy = DIRECTIONS[di] x, y = p p = x + dx, y + dy print(len(grid)) render(grid)
def reset_state(): global vm vm = Intcode(program=load(day=13)) vm.program[0] = 2 # insert coin vm.write(0) # dont touch joy first frame return jsonify('ok')
class State: def __init__(self): self.intcode = Intcode(program) self.latest = None self.position = (0, 0) self.grid = dict() def go(self, direction): if direction in DIRECTIONS: self.grid[self.position] = 'visited' dx, dy = DIRECTIONS[direction] x, y = self.position self.position = x + dx, y + dy data = direction game.intcode.write_ascii(data) game.intcode.write(10) game.latest = self.intcode.read_ascii() self.update_seen() print(self.latest) def update_seen(self): # Update seen rooms nav = parse(self.latest).get('navigation') or [] x, y = self.position for direction in nav: if direction in DIRECTIONS: dx, dy = DIRECTIONS[direction] p = x + dx, y + dy if p not in self.grid: self.grid[p] = 'seen' def take(self, item): data = "take " + request.json self.intcode.write_ascii(data) self.intcode.write(10) self.latest = game.intcode.read_ascii() print(self.latest) def drop(self, item): data = "drop " + request.json self.intcode.write_ascii(data) self.intcode.write(10) self.latest = game.intcode.read_ascii() print(self.latest) def chart(self): w, h = 16, 16 def tojs(p, **kwargs): x, y = p d = dict(x=x + w // 2, y=y + h // 2) d.update(kwargs) return d rooms = [] for p, value in self.grid.items(): rooms.append(tojs(p, value=value)) return dict(rooms=rooms, position=tojs(self.position)) def inventory(self): self.intcode.write_ascii('inv\n') raw = self.intcode.read_ascii() return parse_inventory(raw) def json(self): j = parse(game.latest) j['inventory'] = self.inventory() return j