aoc2025/bob/day05/day05-p2.py

61 lines
1.5 KiB
Python

def item_in_range(item, id_range):
start = id_range[0]
end = id_range[1]
return start <= item <= end
def squash_ranges(id_ranges):
while True:
id_ranges_size = len(id_ranges)
squash_range = []
squash_range.append(id_ranges[0].copy())
for checker in id_ranges:
overlap = False
for candidate in squash_range:
# Squash if checker min within candidate range or otherway around
if item_in_range(checker[0], candidate) or item_in_range(candidate[0], checker):
overlap = True
candidate[0] = min(checker[0],candidate[0])
candidate[1] = max(checker[1],candidate[1])
if not overlap:
squash_range.append(checker.copy())
id_ranges = squash_range.copy()
if id_ranges_size == len(id_ranges):
# If no changes, break
break
return id_ranges
def read_input(filename):
id_ranges = []
for line in open(filename).read().splitlines():
if line == "":
return id_ranges
id_range = line.split("-")
id_ranges.append([int(id_range[0]),int(id_range[1])])
# filename = "day05/my_example_input"
# filename = "day05/example_input" # 14
filename = "day05/input" # 358155203664116
id_ranges = read_input(filename)
id_ranges = squash_ranges(id_ranges)
counter = 0
for id_range in id_ranges:
counter += (id_range[1] - id_range[0]) + 1 # ranges are inclusive...
print(f"Fresh items: {counter}")