Extract Coordinate, IntegerRange and Coordinate3d to new AdventOfCode.HelperClasses project and refactor solution for modularity and type consistency

This commit is contained in:
Sebastian Lindemeier
2025-12-12 13:14:17 +01:00
parent 85516cd783
commit aaf32260d0
13 changed files with 119 additions and 143 deletions
+17 -44
View File
@@ -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;
}
}