StyleInCode

RSS

 

Day 5 - Advent of Code 2025

5 December 2025

Working solutions for the day 5 puzzles.

Part One

""" day_05_01.py """

# usage: python3 day_05_01.py


def get(filename):
    """ contents of filename """
    with open(filename, 'r', encoding='utf-8') as infile:
        data = infile.read().strip()

    return data


def test(data, given_solution):
    """ testing """
    assert solve(data) == given_solution


def check(item, ranges):
    """ item in ranges """
    for begin, end in ranges:
        if begin <= item <= end:
            return True

    return False


def solve(data):
    """ solve the puzzle """
    fresh, available = data.split('\n\n')

    fresh = [tuple(map(int, interval.split('-')))
             for interval in fresh.split()]

    available = [int(i) for i in available.split()]
    unspoiled = sum(1 for ingredient in available if check(ingredient, fresh))

    return unspoiled


if __name__ == '__main__':
    test(get('example01'), 3)

    puzzle = get('input')
    solution = solve(puzzle)

    print(solution)

Part Two

""" day_05_02.py """

# usage: python3 day_05_02.py


def get(filename):
    """ contents of filename """
    with open(filename, 'r', encoding='utf-8') as infile:
        data = infile.read().strip()

    return data


def test(data, given_solution):
    """ testing """
    assert solve(data) == given_solution


def collapse(ranges):
    """ eliminate overlap """
    before, after = [], ranges[:]
    after.sort()

    while before != after:
        before = after
        for i in range(len(before) - 1):
            (x1, y1), (x2, y2) = before[i], before[i + 1]

            if y1 >= y2:
                after = before[:i + 1] + before[i + 2:]
                break

            if y1 >= x2:
                after = after[:i] + [(x1, y2)] + before[i + 2:]
                break

    return after


def solve(data):
    """ solve the puzzle """
    fresh, _ = data.split('\n\n')

    fresh = [tuple(map(int, interval.split('-')))
             for interval in fresh.split()]

    return sum(end - begin + 1 for begin, end in collapse(fresh))


if __name__ == '__main__':
    test(get('example01'), 14)

    puzzle = get('input')
    solution = solve(puzzle)

    print(solution)

Categories

Links