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;
|
return sumIds;
|
||||||
}
|
}
|
||||||
|
|
||||||
private IEnumerable<long> FilterFreshIds(IEnumerable<long> ids, Range[] freshIdRanges)
|
public long SolvePart2Again(string pathToPuzzleInput)
|
||||||
{
|
{
|
||||||
var freshIds = ids.Where(id => IsIdInRanges(id, freshIdRanges));
|
var database = ParsePuzzleInput(pathToPuzzleInput);
|
||||||
return freshIds;
|
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)
|
private IEnumerable<long> ParseIds(List<string> ids)
|
||||||
|
|
@ -60,6 +64,12 @@ public class Day05 : IPuzzleSolver<long>
|
||||||
.ToArray();
|
.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)
|
private bool IsIdInRanges(long id, IEnumerable<Range> ranges)
|
||||||
{
|
{
|
||||||
return ranges.Any(range => IsIdInRange(id, range));
|
return ranges.Any(range => IsIdInRange(id, range));
|
||||||
|
|
@ -83,4 +93,29 @@ public class Day05 : IPuzzleSolver<long>
|
||||||
|
|
||||||
return sumFreshIds;
|
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