示例#1
0
文件: 15.py 项目: vidstige/aoc
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
示例#2
0
文件: 11.py 项目: vidstige/aoc
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)
示例#3
0
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')
示例#4
0
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