Add another Day 05 part 2 solution with combining overlapping ranges

This commit is contained in:
Sebastian Lindemeier 2025-12-05 07:57:59 +01:00
parent 1cd63a7188
commit 0d028c4282
1 changed files with 39 additions and 4 deletions

View File

@ -36,10 +36,14 @@ public class Day05 : IPuzzleSolver<long>
return sumIds;
}
private IEnumerable<long> FilterFreshIds(IEnumerable<long> 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<long> ParseIds(List<string> ids)
@ -60,6 +64,12 @@ public class Day05 : IPuzzleSolver<long>
.ToArray();
}
private IEnumerable<long> FilterFreshIds(IEnumerable<long> ids, Range[] freshIdRanges)
{
var freshIds = ids.Where(id => IsIdInRanges(id, freshIdRanges));
return freshIds;
}
private bool IsIdInRanges(long id, IEnumerable<Range> ranges)
{
return ranges.Any(range => IsIdInRange(id, range));
@ -83,4 +93,29 @@ public class Day05 : IPuzzleSolver<long>
return sumFreshIds;
}
private List<Range> CombineOverlappingRanges(Range[] ranges)
{
var optimizedRanges = new List<Range>(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<long> CountIdsInRanges(List<Range> combinedRanges)
{
var countIdsInRanges = combinedRanges.Select(range => range.to - range.from + 1);
return countIdsInRanges;
}
}