Add another Day 05 part 2 solution with combining overlapping ranges
This commit is contained in:
parent
1cd63a7188
commit
0d028c4282
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue