def check_for_tractor_beam(self, x, y): if self.use_test_input: return 1 if self.test_input[y][x] != '.' else 0 beam = Intcode(self.machine) beam.input([x, y]) out = beam.execute() return out
def solve(a, x): intc = Intcode(a) intc.input([x]) intc.run() while intc.o == 0: intc.run() print(intc.o)
def main(puzzle_input): computer = Intcode(puzzle_input) computer.input = [1] computer.run_program() part1 = computer.output[-1] computer = Intcode(puzzle_input) computer.input = [5] computer.run_program() part2 = computer.output[0] return part1, part2
def main(puzzle_input): part1 = 0 for phaseSettings in itertools.permutations(range(5)): prev_output = [0] for phaseSetting in phaseSettings: computer = Intcode(puzzle_input) computer.input = [phaseSetting, prev_output[0]] computer.run_program() part1 = max(part1, computer.output[0]) prev_output = computer.output part2 = 0 computer_count = 5 for phaseSettings in itertools.permutations(range(5, 10)): computers = [Intcode("0") for _ in range(computer_count)] for i in range(computer_count): computers[i].memory = computer.memory.copy() computers[i].output = [phaseSettings[i]] for i in range(computer_count): computers[i].input = computers[i - 1].output computers[0].input.append(0) while computers[0].finished == False: for i in range(computer_count): computers[i].run_program() part2 = max(part2, computers[-1].output[0]) return part1, part2
def main(puzzle_input): computer = Intcode(puzzle_input) program_input = [] add_function(program_input, "NOT C J") add_function(program_input, "AND D J") add_function(program_input, "NOT A T") add_function(program_input, "OR T J") add_function(program_input, "WALK") computer.input = program_input computer.run_program() for c in computer.output: if c >= 256: part1 = c break # ABC[D]EFG[H]I program_input = [] # Hole in A or B or C add_function(program_input, "NOT A J") add_function(program_input, "NOT B T") add_function(program_input, "OR T J") add_function(program_input, "NOT C T") add_function(program_input, "OR T J") # Ground in D and (H or (E and I)) add_function(program_input, "AND D J") add_function(program_input, "OR I T") add_function(program_input, "AND E T") add_function(program_input, "OR H T") add_function(program_input, "AND T J") add_function(program_input, "RUN") computer = Intcode(puzzle_input) computer.input = program_input computer.run_program() for c in computer.output: if c >= 256: part2 = c break return part1, part2
def part2(input): code = [ 'A,B,B,C,A,B,C,A,B,C', 'L,6,R,12,L,4,L,6', 'R,6,L,6,R,12', 'L,6,L,10,L,10,R,6', 'n' ] code = '\n'.join(code) + '\n' prog = Intcode(input) prog[0] = 2 prog.input = list(map(ord, code)) prog.run() assert not prog.input return prog.output[-1]
def main(puzzle_input): computer = Intcode(puzzle_input) computer.run_program() grid = [] inner = [] for c in computer.output: if c == 10: if len(inner) > 0: grid.append(inner) inner = [] else: inner.append(chr(c)) #print(chr(c), end = '') part1 = 0 for x in range(1, len(grid[0]) - 1): for y in range(1, len(grid) - 1): if grid[y][x] == "#" and all( grid[y + yy][x + xx] == "#" for (xx, yy) in [(0, -1), (1, 0), (0, 1), (-1, 0)]): part1 += x * y for x in range(len(grid[0])): for y in range(len(grid)): if grid[y][x] in "^v<>": pos = x + y * 1j direction = {"^": -1j, "v": 1j, "<": -1, ">": 1}[grid[y][x]] break commands = find_commands(pos, direction, grid) functions = find_functions(commands, []) main_routine = create_main_routine(commands, functions) program_input = [] add_function(program_input, main_routine) for function in functions: add_function(program_input, ",".join(map(str, function))) add_function(program_input, "n") #add_function(program_input, "A,B,A,B,A,C,A,C,B,C") #add_function(program_input, "R,6,L,10,R,10,R,10") #add_function(program_input, "L,10,L,12,R,10") #add_function(program_input, "R,6,L,12,L,10") #add_function(program_input, "n") computer = Intcode(puzzle_input) computer.memory[0] = 2 computer.input = program_input computer.run_program() part2 = computer.output[-1] return part1, part2
def main(puzzle_input): part1 = 0 for y in range(50): for x in range(50): computer = Intcode(puzzle_input) computer.input = [x, y] computer.run_program() part1 += computer.output[0] left = 0 right = [] y = 5 while True: for x in range(left, left + 100): computer = Intcode(puzzle_input) computer.input = [x, y] computer.run_program() if computer.output[0] == 1: left = x break if len(right) == 0: right.append(left) for x in range(right[-1], right[-1] + 100): computer = Intcode(puzzle_input) computer.input = [x, y] computer.run_program() if computer.output[0] == 0: right.append(x - 1) break if len(right) > 100: if right[-100] - 99 >= left: part2 = left * 10000 + y - 99 break y += 1 return part1, part2
def solve(a, i): intc = Intcode(a) intc.input([i]) intc.run() return intc.o