Exemplo n.º 1
0
 def test_prog_2(self):
     code = Intcode([2, 3, 0, 3, 99], 3)
     result = code.run()
     assert result == 2
     assert code.program == [2, 3, 0, 6, 99]
     assert code.pointer == 4
     assert code.terminated
Exemplo n.º 2
0
 def test_prog_2(self):
     code = Intcode([2, 3, 0, 3, 99], 3)
     result = code.run()
     assert result == (2, True)
     assert code.program == defaultdict(int, enumerate([2, 3, 0, 6, 99]))
     assert code.pointer == 4
     assert code.terminated
Exemplo n.º 3
0
 def test_prog_1(self):
     code = Intcode([1, 0, 0, 0, 99])
     result = code.run()
     assert result == 2
     assert code.program == [2, 0, 0, 0, 99]
     assert code.pointer == 4
     assert code.terminated
Exemplo n.º 4
0
 def test_prog_3(self):
     code = Intcode([2, 4, 4, 5, 99, 0], 4, 4)
     result = code.run()
     assert result == 2
     assert code.program == [2, 4, 4, 5, 99, 9801]
     assert code.pointer == 4
     assert code.terminated
Exemplo n.º 5
0
 def test_cmd99(self):
     code = Intcode([1, 9, 10, 3, 2, 3, 11, 0, 99, 30, 40, 50], 9, 10)
     code.pointer = 8
     code.cmd99()
     assert code.program == [1, 9, 10, 3, 2, 3, 11, 0, 99, 30, 40, 50]
     assert code.pointer == 8
     assert code.terminated
Exemplo n.º 6
0
def main():
    inputs = list(
        map(int, [
            mass.strip().split(',')
            for mass in open('../inputs/Advent2019_02.txt', 'r')
        ][0]))

    print(
        f'AoC 2019 Day 2, Part 1 answer is {Intcode(inputs[:], NOUN, VERB).run()}'
    )

    # determine whether to iterate nouns or verbs first, whichever has the greatest effect on result:
    # Would be an O(2n) solution rather than a nested loop O(n**2) solution

    if Intcode(inputs[:], NOUN + 1, VERB).run() > Intcode(
            inputs[:], NOUN, VERB + 1).run():
        noun, verb, result = iterate_noun(inputs[:], NOUN, VERB)
        noun, verb, result = iterate_verb(inputs[:], noun, VERB)
    else:
        noun, verb, result = iterate_verb(inputs[:], NOUN, VERB)
        noun, verb, result = iterate_noun(inputs[:], NOUN, verb)
    if Intcode(inputs[:], noun, verb).run() == OUTPUT:
        print(f'AoC 2019 Day 2, Part 2 answer is {noun * 100 + verb}')
    else:
        print(f'Error')
Exemplo n.º 7
0
 def test_cmd2(self):
     code = Intcode([1, 9, 10, 3, 2, 3, 11, 0, 99, 30, 40, 50], 9, 10)
     code.pointer = 4
     code.cmd2()
     assert code.program == [150, 9, 10, 3, 2, 3, 11, 0, 99, 30, 40, 50]
     assert code.pointer == 4
     assert not code.terminated
Exemplo n.º 8
0
 def test_prog_4(self):
     code = Intcode([1, 1, 1, 4, 99, 5, 6, 0, 99], 1, 1)
     result = code.run()
     assert result == 30
     assert code.program == [30, 1, 1, 4, 2, 5, 6, 0, 99]
     assert code.pointer == 8
     assert code.terminated
Exemplo n.º 9
0
 def test_prog_4(self):
     code = Intcode([1, 1, 1, 4, 99, 5, 6, 0, 99], 1, 1)
     result = code.run()
     assert result == (30, True)
     assert code.program == defaultdict(
         int, enumerate([30, 1, 1, 4, 2, 5, 6, 0, 99]))
     assert code.pointer == 8
     assert code.terminated
Exemplo n.º 10
0
 def test_prog_3(self):
     code = Intcode([2, 4, 4, 5, 99, 0], 4, 4)
     result = code.run()
     assert result == (2, True)
     assert code.program == defaultdict(int,
                                        enumerate([2, 4, 4, 5, 99, 9801]))
     assert code.pointer == 4
     assert code.terminated
Exemplo n.º 11
0
 def test_cmd99(self):
     code = Intcode([1, 9, 10, 3, 2, 3, 11, 0, 99, 30, 40, 50], 9, 10)
     code.pointer = 8
     code.cmd99()
     assert code.program == defaultdict(
         int, enumerate([1, 9, 10, 3, 2, 3, 11, 0, 99, 30, 40, 50]))
     assert code.pointer == 8
     assert code.terminated
Exemplo n.º 12
0
 def test_cmd01_position(self):
     code = Intcode([1, 9, 10, 3, 2, 3, 11, 0, 99, 30, 40, 50], 9, 10)
     operation = f'{code.program[code.pointer]:>05}'
     code.parm3, code.parm2, code.parm1 = map(int, tuple(operation[0:3]))
     code.cmd01()
     assert code.program == [1, 9, 10, 70, 2, 3, 11, 0, 99, 30, 40, 50]
     assert code.pointer == 4
     assert not code.terminated
Exemplo n.º 13
0
 def test_relative_mode1(self):
     program = [
         109, 1, 204, -1, 1001, 100, 1, 100, 1008, 100, 16, 101, 1006, 101,
         0, 99
     ]
     code = Intcode(program[:], mode='test')
     assert code.run() == [
         109, 1, 204, -1, 1001, 100, 1, 100, 1008, 100, 16, 101, 1006, 101,
         0, 99
     ]
Exemplo n.º 14
0
 def __init__(self, code):
     self.x = 21
     self.y = 19
     self.code = code
     self.program = Intcode(self.code, inp=[], mode='run')
     self.stack = []
     self.found = []
     self.grid = np.full([41, 41], -1, dtype=int)
     self.grid[self.x, self.y] = 1
     self.explore()
Exemplo n.º 15
0
def main():
    inputs = list(
        map(int, [
            mass.strip().split(',')
            for mass in open('../inputs/Advent2019_05.txt', 'r')
        ][0]))
    print(f'AoC 2019 Day 9, Part 1: \n')
    Intcode(inputs[:], inp=1).run()
    print(f'\nAoC 2019 Day 9, Part 2: \n')
    Intcode(inputs[:], inp=5).run()
Exemplo n.º 16
0
 def test_cmd01_immediate3(self):
     code = Intcode([1101, 9, 10, 3, 2, 3, 11, 0, 99, 30, 40, 50], 9, 10)
     operation = f'{code.program[code.pointer]:>05}'
     code.parm3, code.parm2, code.parm1 = map(int, tuple(operation[0:3]))
     code.cmd01()
     assert code.parm1
     assert code.parm2
     assert not code.parm3
     assert code.program == defaultdict(
         int, enumerate([1101, 9, 10, 19, 2, 3, 11, 0, 99, 30, 40, 50]))
     assert code.pointer == 4
     assert not code.terminated
Exemplo n.º 17
0
 def test_cmd09_immediate(self):
     code = Intcode([109, 7, 10, 3, 2, 3, 11, 13, 99, 30, 40, 50])
     assert code.relative_base == 0
     assert code.pointer == 0
     operation = f'{code.program[code.pointer]:>05}'
     code.parm3, code.parm2, code.parm1 = map(int, tuple(operation[0:3]))
     code.cmd09()
     assert code.program == defaultdict(
         int, enumerate([109, 7, 10, 3, 2, 3, 11, 13, 99, 30, 40, 50]))
     assert code.pointer == 2
     assert code.relative_base == 7
     assert not code.terminated
Exemplo n.º 18
0
def main():
    inputs = list(
        map(int, [
            code.strip().split(',')
            for code in open('../inputs/Advent2019_09.txt', 'r')
        ][0]))
    # inputs = [109, 1, 204, -1, 1001, 100, 1, 100, 1008, 100, 16, 101, 1006, 101, 0, 99]
    # inputs = [1102, 34915192, 34915192, 7, 4, 7, 99, 0]
    # inputs = [104, 1125899906842624, 99]
    print(f'AoC 2019 Day 9, Part 1: \n')
    Intcode(inputs[:], inp=[1]).run()
    print(f'\nAoC 2019 Day 9, Part 2: \n')
    Intcode(inputs[:], inp=[2]).run()
Exemplo n.º 19
0
def iterate_noun(inputs, noun_, verb):
    for noun in range(noun_, 99):
        result = Intcode(inputs[:], noun, verb).run()
        if result >= OUTPUT:
            if result > OUTPUT:
                noun -= 1
            return noun, verb, result
Exemplo n.º 20
0
def iterate_verb(inputs, noun, verb_):
    for verb in range(verb_, 99):
        result = Intcode(inputs[:], noun, verb).run()
        if result >= OUTPUT:
            if result > OUTPUT:
                verb -= 1
            return noun, verb, result
Exemplo n.º 21
0
class Robot(object):
    dX = {1: 0, 2: 0, 3: -1, 4: 1}
    dY = {1: 1, 2: -1, 3: 0, 4: 0}
    back = {1: 2, 2: 1, 3: 4, 4: 3}

    def __init__(self, code):
        self.x = 21
        self.y = 19
        self.code = code
        self.program = Intcode(self.code, inp=[], mode='run')
        self.stack = []
        self.found = []
        self.grid = np.full([41, 41], -1, dtype=int)
        self.grid[self.x, self.y] = 1
        self.explore()

    def step(self, direction):
        self.program.next_inp(direction)
        result = self.program.run()[0]
        if result:
            self.x += Robot.dX[direction]
            self.y += Robot.dY[direction]
        return result

    def explore(self):
        for direction in range(1, 5):
            if self.grid[self.x + Robot.dX[direction],
                         self.y + Robot.dY[direction]] == -1:
                result = self.step(direction)
                if result == 2:
                    self.found = [self.x, self.y]
                if result:
                    self.grid[self.x, self.y] = 1
                    self.step(Robot.back[direction])
                    self.stack.append(["N", direction])
                else:
                    self.grid[self.x + Robot.dX[direction],
                              self.y + Robot.dY[direction]] = 0

    def move(self):
        while self.stack:
            move_type, direction = self.stack.pop()
            self.step(direction)

            if move_type == "N":
                self.stack.append(["R", Robot.back[direction]])
                self.explore()
Exemplo n.º 22
0
 def test_amplifiers1(self):
     program = [
         3, 15, 3, 16, 1002, 16, 10, 16, 1, 16, 15, 15, 4, 15, 99, 0, 0
     ]
     nextinput = 0
     for phase in [4, 3, 2, 1, 0]:
         nextinput, terminated = Intcode(program,
                                         inp=[phase, nextinput],
                                         mode='run').run()
     assert nextinput == 43210
Exemplo n.º 23
0
 def test_amplifiers2(self):
     program = [
         3, 23, 3, 24, 1002, 24, 10, 24, 1002, 23, -1, 23, 101, 5, 23, 23,
         1, 24, 23, 23, 4, 23, 99, 0, 0
     ]
     nextinput = 0
     for phase in [0, 1, 2, 3, 4]:
         nextinput, terminated = Intcode(program,
                                         inp=[phase, nextinput],
                                         mode='run').run()
     assert nextinput == 54321
Exemplo n.º 24
0
 def test_amplifiers3(self):
     program = [
         3, 31, 3, 32, 1002, 32, 10, 32, 1001, 31, -2, 31, 1007, 31, 0, 33,
         1002, 33, 7, 33, 1, 33, 31, 31, 1, 32, 31, 31, 4, 31, 99, 0, 0, 0
     ]
     nextinput = 0
     for phase in [1, 0, 4, 3, 2]:
         nextinput, terminated = Intcode(program,
                                         inp=[phase, nextinput],
                                         mode='run').run()
     assert nextinput == 65210
Exemplo n.º 25
0
def painting_robot(inputs: list, start: int) -> (np.array, np.array):
    grid = np.zeros([50, 65], dtype=int)
    boolgrid = np.zeros([50, 65], dtype=bool)
    robot_pos = np.array([0, 20])
    robot_dir = 0
    directions = np.array([[0, 1], [1, 0], [0, -1], [-1, 0]])
    terminated = False
    paint = Intcode(inputs[:], inp=[start], mode='run')
    while not terminated:
        colour, terminated = paint.run()
        grid[tuple(robot_pos)] = colour
        boolgrid[tuple(robot_pos)] = True
        direction, terminated = paint.run()
        if terminated:
            break
        if direction == 0:
            robot_dir -= 1
        elif direction == 1:
            robot_dir += 1
        else:
            raise ValueError
        robot_dir %= 4
        robot_pos += directions[robot_dir]
        paint.next_inp(grid[tuple(robot_pos)])
    return grid, boolgrid
Exemplo n.º 26
0
 def test_cmd08_equals_false(self):
     code = Intcode([7, 10, 10, 3, 2, 3, 11, 0, 99, 30, 40, 50])
     code.pointer = 0
     operation = f'{code.program[code.pointer]:>05}'
     code.parm3, code.parm2, code.parm1 = map(int, tuple(operation[0:3]))
     code.cmd08()
     assert code.program == [7, 10, 10, 1, 2, 3, 11, 0, 99, 30, 40, 50]
     assert code.pointer == 4
     assert not code.terminated
Exemplo n.º 27
0
 def test_cmd06_position_jump_if_false_false(self):
     code = Intcode([6, 7, 10, 3, 2, 3, 11, 0, 99, 30, 40, 50])
     code.pointer = 0
     operation = f'{code.program[code.pointer]:>05}'
     code.parm3, code.parm2, code.parm1 = map(int, tuple(operation[0:3]))
     code.cmd06()
     assert code.program == [6, 7, 10, 3, 2, 3, 11, 0, 99, 30, 40, 50]
     assert code.pointer == 40
     assert not code.terminated
Exemplo n.º 28
0
 def test_cmd05_position_jump_if_true_false(self):
     code = Intcode([5, 7, 10, 3, 2, 3, 11, 0, 99, 30, 40, 50])
     code.pointer = 0
     operation = f'{code.program[code.pointer]:>05}'
     code.parm3, code.parm2, code.parm1 = map(int, tuple(operation[0:3]))
     code.cmd05()
     assert code.program == defaultdict(
         int, enumerate([5, 7, 10, 3, 2, 3, 11, 0, 99, 30, 40, 50]))
     assert code.pointer == 3
     assert not code.terminated
Exemplo n.º 29
0
 def test_cmd07_less_than_false(self):
     code = Intcode([7, 10, 10, 3, 2, 3, 11, 0, 99, 30, 40, 50])
     code.pointer = 0
     operation = f'{code.program[code.pointer]:>05}'
     code.parm3, code.parm2, code.parm1 = map(int, tuple(operation[0:3]))
     code.cmd07()
     assert code.program == defaultdict(
         int, enumerate([7, 10, 10, 0, 2, 3, 11, 0, 99, 30, 40, 50]))
     assert code.pointer == 4
     assert not code.terminated
Exemplo n.º 30
0
 def test_cmd02_position(self):
     code = Intcode([1, 9, 10, 3, 2, 3, 11, 0, 99, 30, 40, 50], 9, 10)
     code.pointer = 4
     operation = f'{code.program[code.pointer]:>05}'
     code.parm3, code.parm2, code.parm1 = map(int, tuple(operation[0:3]))
     code.cmd02()
     assert code.program == defaultdict(
         int, enumerate([150, 9, 10, 3, 2, 3, 11, 0, 99, 30, 40, 50]))
     assert code.pointer == 8
     assert not code.terminated