Esempio n. 1
0
 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
Esempio n. 2
0
def solve(a, x):
    intc = Intcode(a)
    intc.input([x])
    intc.run()
    while intc.o == 0:
        intc.run()
    print(intc.o)
Esempio n. 3
0
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
Esempio n. 4
0
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
Esempio n. 5
0
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
Esempio n. 6
0
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]
Esempio n. 7
0
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
Esempio n. 8
0
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
Esempio n. 9
0
def solve(a, i):
    intc = Intcode(a)
    intc.input([i])
    intc.run()
    return intc.o