def reduceRanges() : sortedRanges = sorted(ranges, key=lambda r: r[0]) reducedRanges = [] currentRange = sortedRanges[0] for r in sortedRanges[1:] : if r[0] <= currentRange[1] + 1 : #Overlapping or contiguous ranges, extend current range if needed if r[1] > currentRange[1] : currentRange = (currentRange[0], r[1]) else : #No overlap, save current range and start a new one reducedRanges.append(currentRange) currentRange = r #Add the last range reducedRanges.append(currentRange) return reducedRanges testInput = [ "3-5", "10-14", "16-20", "12-18", "", "1", "5", "8", "11", "17", "32" ] def readFile() : ary = [] with open("files/Problem5.txt", "r") as file : for line in file : ary.append(line.replace("\n", "")) return ary def parseInput(input: list[str]): ranges = [] numbers = [] readingRanges = True for line in input: if line == "": readingRanges = False continue if readingRanges: parts = line.split("-") ranges.append((int(parts[0]), int(parts[1]))) else: numbers.append(int(line)) return ranges, numbers #rawInput = testInput rawInput = readFile() ranges, number = parseInput(rawInput) reducedRanges = reduceRanges() freshCount = 0 spoiledCount = 0 for r in reducedRanges : diff = r[1] - r[0] + 1 #print(f"Range {r[0]}-{r[1]} adds {diff} fresh") freshCount += diff print(f"Fresh count: {freshCount}") #Fresh count: 334714395325710