35 lines
967 B
Python
35 lines
967 B
Python
import bisect
|
|
intervals, ids = open("input", 'r').read().split("\n\n")
|
|
|
|
intervals = sorted([
|
|
[int(nm) for nm in interval.split("-")] for interval in intervals.split("\n")
|
|
])
|
|
ids = [int(id) for id in ids.rstrip().split("\n")]
|
|
|
|
# Merge intervals
|
|
merged_intervals = [intervals[0]]
|
|
for interval in intervals[1:]:
|
|
if interval[0] <= merged_intervals[-1][1]:
|
|
merged_intervals[-1][1] = max(interval[1], merged_intervals[-1][1])
|
|
else:
|
|
merged_intervals.append(interval)
|
|
|
|
def check_id_in_intervals(id, intervals):
|
|
left_interval = bisect.bisect(intervals,id,key=lambda l: l[0])-1
|
|
if left_interval < 0:
|
|
return False
|
|
return id <= intervals[left_interval][1]
|
|
|
|
fresh_ids = [
|
|
check_id_in_intervals(id, merged_intervals)
|
|
for id in ids
|
|
]
|
|
|
|
print(len([fresh_id for fresh_id in fresh_ids if fresh_id is True]))
|
|
|
|
# Part 2
|
|
total = 0
|
|
for interval in merged_intervals:
|
|
start, end = interval
|
|
total += end - start + 1
|
|
print(total)
|