def part_1(data): ranges = [] for line in data.splitlines(): l, h = list(map(int, line.split("-"))) ranges.append((l, h)) ranges.sort() merged = list(ranges[0]) for i in range(1, len(ranges)): current = ranges[i] if current[0] <= merged[1] + 1: merged[1] = max(current[1], merged[1]) else: print(merged[1] + 1) return def part_2(data): ranges = [] for line in data.splitlines(): l, h = list(map(int, line.strip().split("-"))) ranges.append((l, h)) ranges.sort() blocked_merged = [list(ranges[0])] for block in ranges: merged = blocked_merged[-1] if block[0] <= merged[1] + 1: merged[1] = max(block[1], merged[1]) else: blocked_merged.append(list(block)) total = 2**32 for lo, hi in blocked_merged: total -= (hi - lo + 1) print(total) def main(): data = open(0).read().strip() part_1(data) part_2(data) if __name__ == "__main__": main()