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
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
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
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
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
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')
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
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
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
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
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
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
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 ]
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 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()
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
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
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()
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
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
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()
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
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
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
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
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
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
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
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
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