import sys import heapq from typing import List, Tuple, Optional listed_in_range = 0 file = '5.input' if len(sys.argv) <= 1 else sys.argv[1] ranges = [] numbers = None for line in open(file).readlines(): line = line.strip() if line == '': numbers = [] elif numbers is not None: numbers.append(int(line)) else: heapq.heappush(ranges, tuple(map(int, line.split('-')))) for num in numbers: for start, end in ranges: if start <= num and num <= end: listed_in_range += 1 break print(f'p1: {listed_in_range}') dedup_ranges = [] last_start, last_end = None, None while ranges: start, end = heapq.heappop(ranges) if last_start is None: last_start, last_end = start, end elif start <= last_end: # merge interval # print("merge", last_start, last_end, "with", start, end) last_start, last_end = last_start, max(last_end, end) else: # commit interval # print("commit", last_start, last_end) dedup_ranges.append((last_start, last_end)) last_start, last_end = start, end dedup_ranges.append((last_start, last_end)) # print(dedup_ranges) print(f'p2: {sum(end - start + 1 for start, end in dedup_ranges)}')