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)
