Snippets

Lucas Correia Advent of Code - 2021-07

Created by Lucas Correia
import os.path

def read_input(file_name='input.txt'):
    file_path = os.path.join(
        os.path.dirname(__file__),
        file_name
    )
    data = None
    with open(file_path) as file:
        data = file.read()

    return process_input(data)


def process_input(data):
    return [int(value) for value in data.split(',')]


def part_one(crabs):
    max_pos = max(crabs)
    target_pos_fuel = [0 for i in range(max_pos)]
    for target_pos in range(0, max_pos):
        for crab_pos in crabs:
            target_pos_fuel[target_pos] += abs(target_pos - crab_pos)
        print(f'{target_pos}: {target_pos_fuel[target_pos]}') 

    return min(target_pos_fuel)


def part_two(crabs):
    max_pos = max(crabs)
    target_pos_fuel = [0 for i in range(max_pos)]
    cost_per_steps = {}
    for target_pos in range(0, max_pos):
        for crab_pos in crabs:
            steps = abs(target_pos - crab_pos)
            if not steps in cost_per_steps:
                cost_per_steps[steps] = sum((steps-i) for i in range(steps))
            target_pos_fuel[target_pos] += cost_per_steps[steps]
        print(f'{target_pos}: {target_pos_fuel[target_pos]}') 

    return min(target_pos_fuel)


if __name__ == '__main__':
    assert part_one(read_input('input.example.txt')) == 37, 'Unexpected part 1 result for test input'
    result = part_one(read_input())
    print(f'Part 1: {result}')

    assert part_two(read_input('input.example.txt')) == 168, 'Unexpected part 2 result for test input'
    result = part_two(read_input())
    print(f'Part 2: {result}')

Comments (0)

HTTPS SSH

You can clone a snippet to your computer for local editing. Learn more.