Extract Coordinate, IntegerRange and Coordinate3d to new AdventOfCode.HelperClasses project and refactor solution for modularity and type consistency
This commit is contained in:
+17
-44
@@ -1,8 +1,5 @@
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using AdvenOfCode.Contracts;
|
||||
using Range = (long from, long to);
|
||||
using AdvenOfCode.Contracts;
|
||||
using AdventOfCode.HelperClasses;
|
||||
|
||||
namespace AoC_2025;
|
||||
|
||||
@@ -52,54 +49,49 @@ public class Day05 : IPuzzleSolver<long>
|
||||
return parsedIds;
|
||||
}
|
||||
|
||||
private Range[] ParseRanges(IEnumerable<string> ranges)
|
||||
private IntegerRange[] ParseRanges(IEnumerable<string> ranges)
|
||||
{
|
||||
return ranges.Select(range =>
|
||||
{
|
||||
var split = range.Split('-', StringSplitOptions.RemoveEmptyEntries);
|
||||
return (long.Parse(split[0]), long.Parse(split[1]));
|
||||
return new IntegerRange(long.Parse(split[0]), long.Parse(split[1]));
|
||||
})
|
||||
.OrderBy(range => range.Item1)
|
||||
.ThenBy(range => range.Item2)
|
||||
.OrderBy(range => range.start)
|
||||
.ThenBy(range => range.end)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
private IEnumerable<long> FilterFreshIds(IEnumerable<long> ids, Range[] freshIdRanges)
|
||||
private IEnumerable<long> FilterFreshIds(IEnumerable<long> ids, IntegerRange[] 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<IntegerRange> ranges)
|
||||
{
|
||||
return ranges.Any(range => IsIdInRange(id, range));
|
||||
}
|
||||
|
||||
private bool IsIdInRange(long id, Range range)
|
||||
{
|
||||
return range.from <= id && range.to >= id;
|
||||
return ranges.Any(range => range.Contains(id));
|
||||
}
|
||||
|
||||
private long SumIdsInRanges(IEnumerable<Range> ranges)
|
||||
private long SumIdsInRanges(IEnumerable<IntegerRange> ranges)
|
||||
{
|
||||
var sumFreshIds = 0L;
|
||||
var highestSeenId = -1L;
|
||||
foreach (var range in ranges)
|
||||
{
|
||||
var lowestNewId = Math.Max(highestSeenId + 1, range.from);
|
||||
highestSeenId = Math.Max(highestSeenId, range.to);
|
||||
var lowestNewId = Math.Max(highestSeenId + 1, range.start);
|
||||
highestSeenId = Math.Max(highestSeenId, range.end);
|
||||
sumFreshIds += Math.Max(0, highestSeenId - lowestNewId + 1);
|
||||
}
|
||||
|
||||
return sumFreshIds;
|
||||
}
|
||||
|
||||
private List<Range> CombineOverlappingRanges(Range[] ranges)
|
||||
private List<IntegerRange> CombineOverlappingRanges(IntegerRange[] ranges)
|
||||
{
|
||||
var optimizedRanges = new List<Range>(ranges.Length) { ranges[0] };
|
||||
var optimizedRanges = new List<IntegerRange>(ranges.Length) { ranges[0] };
|
||||
foreach (var range in ranges)
|
||||
{
|
||||
if (TryCombineRanges(optimizedRanges[^1], range, out var combined))
|
||||
if (optimizedRanges[^1].TryCombine(range, out var combined))
|
||||
{
|
||||
optimizedRanges[^1] = combined;
|
||||
}
|
||||
@@ -111,29 +103,10 @@ public class Day05 : IPuzzleSolver<long>
|
||||
|
||||
return optimizedRanges;
|
||||
}
|
||||
|
||||
private bool TryCombineRanges(Range first, Range second, out Range combined)
|
||||
{
|
||||
if (IsIdInRange(second.from, first))
|
||||
{
|
||||
var isEndInRange = IsIdInRange(second.to, first);
|
||||
combined = isEndInRange ? first : (first.from, second.to);
|
||||
return true;
|
||||
}
|
||||
// if (IsIdInRange(first.from, second))
|
||||
// {
|
||||
// var isEndInRange = IsIdInRange(first.to, second);
|
||||
// combined = isEndInRange ? second : (second.from, first.to);
|
||||
// return true;
|
||||
// }
|
||||
|
||||
combined = first;
|
||||
return false;
|
||||
}
|
||||
|
||||
private static IEnumerable<long> CountIdsInRanges(IEnumerable<Range> combinedRanges)
|
||||
private static IEnumerable<long> CountIdsInRanges(IEnumerable<IntegerRange> combinedRanges)
|
||||
{
|
||||
var countIdsInRanges = combinedRanges.Select(range => range.to - range.from + 1);
|
||||
var countIdsInRanges = combinedRanges.Select(range => range.Count());
|
||||
return countIdsInRanges;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user