Exemple #1
0
async def intcode_eval(auto_input: List[int] = None) -> int:
    memory = [int(i) for i in utils.load_data(5)[0].split(",")]
    processor = IntCodeProcessor(memory)

    for i in auto_input:
        await processor.input(i)
    return await processor.run(return_last_output=True)
Exemple #2
0
def part1() -> int:
    total_fuel_mass = 0

    for module_mass in utils.load_data(1):
        module_mass = int(module_mass)
        total_fuel_mass += fuel_needed(module_mass)

    return total_fuel_mass
Exemple #3
0
def part2() -> int:
    total_fuel_mass = 0

    for module_mass in utils.load_data(1):
        module_mass = int(module_mass)
        extra_fuel_mass = fuel_needed(module_mass)
        total_fuel_mass += extra_fuel_mass

        while extra_fuel_mass := fuel_needed(extra_fuel_mass):
            total_fuel_mass += extra_fuel_mass
Exemple #4
0
def load_data():
    orbits = {}
    inverse_orbits = {}

    for d in utils.load_data(6):
        centre, orbiter = d.split(")")
        orbits[orbiter] = centre
        inverse_orbits.setdefault(centre, []).append(orbiter)

    return orbits, inverse_orbits
Exemple #5
0
def part1():
    data = utils.load_data(8)[0]
    width = 25
    height = 6
    pixels_per_layer = width * height
    min_zero_layer = None

    for layer in chunked(data, pixels_per_layer):
        layer_counter = Counter(layer)
        if min_zero_layer is None or layer_counter["0"] < min_zero_layer["0"]:
            min_zero_layer = layer_counter

    return min_zero_layer["1"] * min_zero_layer["2"]
Exemple #6
0
def part2():
    data = utils.load_data(8)[0]
    width = 25
    height = 6
    pixels_per_layer = width * height

    output_map = {"0": " ", "1": "#"}

    output: List[Optional[str]] = [None] * pixels_per_layer
    for layer in chunked(data, pixels_per_layer):
        for i, value in enumerate(layer):
            if output[i] is None and value != "2":
                output[i] = output_map[value]

    for row in chunked(output, width):
        print("".join(row))
Exemple #7
0
def part2() -> int:
    data = utils.load_data(3)
    wire1 = data[0].split(",")
    wire2 = data[1].split(",")

    w1_points = get_points(wire1)
    w2_points = get_points(wire2)

    intersections = set(w1_points).intersection(set(w2_points))

    min_dist = None

    for intersection in intersections:
        dist = w1_points[intersection] + w2_points[intersection]
        min_dist = utils.safe_min(min_dist, dist)

    return min_dist
Exemple #8
0
def intcode_eval(noun: int, verb: int) -> int:
    data = utils.load_data(2)[0]

    memory = [int(i) for i in data.split(",")]
    memory[1] = noun
    memory[2] = verb

    ip = 0

    while (opcode := memory[ip]) in OPCODES:
        nargs, op = OPCODES[opcode]
        args = memory[ip + 1:ip + nargs]

        result = op(memory[args[0]], memory[args[1]])

        memory[args[2]] = result
        ip += nargs
Exemple #9
0
async def intcode_eval(phase_settings) -> int:
    memory = [int(i) for i in utils.load_data(7)[0].split(",")]
    processors = []

    for phase_setting in phase_settings:
        processor = IntCodeProcessor(memory)
        processors.append(processor)
        asyncio.create_task(processor.run())
        await processor.input(phase_setting)

    output = 0
    for processor in cycle(processors):
        if processor.state is RunState.TERMINATED:
            break
        await processor.input(output)
        output = await processor.output()

    return output
Exemple #10
0
def main() -> None:
    data = utils.load_data(10)
    asteroid_coords = []
    for y, row in enumerate(data):
        for x, sector in enumerate(row):
            if sector == "#":
                asteroid_coords.append((x, y))

    visible_asteroids = {}
    all_vectors = {}

    for origin, destination in product(asteroid_coords, asteroid_coords):
        if origin == destination:
            continue

        vector = Vector(origin, destination)

        visible_asteroids.setdefault(origin, set()).add(vector.direction)
        all_vectors.setdefault(origin, []).append(vector)

    max_visible, max_coord = max(
        (len(directions), coord) for coord, directions in visible_asteroids.items()
    )

    print(f"Part 1: {max_visible}")

    other_asteroids = sorted(all_vectors[max_coord], key=lambda x: x.magnitude)
    asteroids_by_angle = {}
    for asteroid in other_asteroids:
        asteroids_by_angle.setdefault(asteroid.angle, collections.deque()).append(
            asteroid.destination
        )

    count = 0
    while asteroids_by_angle:
        for angle in list(sorted(asteroids_by_angle.keys())):
            coords = asteroids_by_angle[angle]
            count += 1
            coord = coords.popleft()
            if count == 200:
                print(f"Part 2: {100 * coord[0] + coord[1]}")
                return
            if not len(coords):
                asteroids_by_angle.pop(angle)
Exemple #11
0
def part1() -> int:
    data = utils.load_data(3)
    wire1 = data[0].split(",")
    wire2 = data[1].split(",")

    origin = (0, 0)

    w1_points = get_points(wire1, origin)
    w2_points = get_points(wire2, origin)

    intersections = set(w1_points).intersection(set(w2_points))

    min_dist = None
    for intersection in intersections:
        # if intersection == origin:
        #     continue
        dist = manhattan_distance(intersection, origin)
        min_dist = utils.safe_min(min_dist, dist)

    return min_dist
Exemple #12
0
async def run():
    memory = [int(i) for i in utils.load_data(13)[0].split(",")]
    arcade = Arcade(memory, add_credit=True)
    result = await arcade.run()
    return result
Exemple #13
0
async def run(start):
    memory = [int(i) for i in utils.load_data(11)[0].split(",")]
    painter = Painter(memory, start)
    result = await painter.run()
    print(str(painter))
    return result