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)