diff --git a/AoC_2025/Day05.cs b/AoC_2025/Day05.cs index c7f3afb..df3e31b 100644 --- a/AoC_2025/Day05.cs +++ b/AoC_2025/Day05.cs @@ -35,11 +35,15 @@ public class Day05 : IPuzzleSolver var sumIds = SumIdsInRanges(freshIdRanges); return sumIds; } - - private IEnumerable FilterFreshIds(IEnumerable ids, Range[] freshIdRanges) + + public long SolvePart2Again(string pathToPuzzleInput) { - var freshIds = ids.Where(id => IsIdInRanges(id, freshIdRanges)); - return freshIds; + var database = ParsePuzzleInput(pathToPuzzleInput); + var freshIdRanges = ParseRanges(database.freshIdRanges); + var combinedRanges = CombineOverlappingRanges(freshIdRanges); + var countIdsInRanges = CountIdsInRanges(combinedRanges); + var sumIds = countIdsInRanges.Sum(); + return sumIds; } private IEnumerable ParseIds(List ids) @@ -59,6 +63,12 @@ public class Day05 : IPuzzleSolver .ThenBy(range => range.Item2) .ToArray(); } + + private IEnumerable FilterFreshIds(IEnumerable ids, Range[] freshIdRanges) + { + var freshIds = ids.Where(id => IsIdInRanges(id, freshIdRanges)); + return freshIds; + } private bool IsIdInRanges(long id, IEnumerable ranges) { @@ -83,4 +93,29 @@ public class Day05 : IPuzzleSolver return sumFreshIds; } + + private List CombineOverlappingRanges(Range[] ranges) + { + var optimizedRanges = new List(ranges.Length) { ranges[0] }; + foreach (var range in ranges) + { + var lastRange = optimizedRanges[^1]; + if (range.from > lastRange.to) + { + optimizedRanges.Add(range); + } + else if (IsIdInRange(range.from, lastRange) && ! IsIdInRange(range.to, lastRange)) + { + optimizedRanges[^1] = (lastRange.from, range.to); + } + } + + return optimizedRanges; + } + + private static IEnumerable CountIdsInRanges(List combinedRanges) + { + var countIdsInRanges = combinedRanges.Select(range => range.to - range.from + 1); + return countIdsInRanges; + } } \ No newline at end of file