58 lines
No EOL
1.7 KiB
C#
58 lines
No EOL
1.7 KiB
C#
using AdventOfCode2025.Inputs;
|
|
|
|
namespace AdventOfCode2025.Solutions;
|
|
|
|
public class Day5() : Solution(5)
|
|
{
|
|
public override string SolvePart1()
|
|
{
|
|
List<string> lines = Input.Lines.ToList();
|
|
List<Range> freshRanges = GetFreshRanges(lines);
|
|
int freshIngredients = lines[(freshRanges.Count + 1)..].Select(long.Parse).Count(id => IsFresh(id, freshRanges));
|
|
return freshIngredients.ToString();
|
|
}
|
|
|
|
public override string SolvePart2()
|
|
{
|
|
List<string> lines = Input.Lines.ToList();
|
|
List<Range> ranges = GetFreshRanges(lines).OrderBy(x => x.From).ThenBy(x => x.To).ToList();
|
|
|
|
var merged = new List<Range>();
|
|
Range current = ranges[0];
|
|
|
|
for (var i = 1; i < ranges.Count; i++)
|
|
{
|
|
Range next = ranges[i];
|
|
|
|
if (next.From <= current.To)
|
|
{
|
|
current.To = Math.Max(current.To, next.To);
|
|
}
|
|
else
|
|
{
|
|
merged.Add(current);
|
|
current = next;
|
|
}
|
|
}
|
|
|
|
merged.Add(current);
|
|
|
|
return merged.Sum(r => r.To - r.From + 1).ToString();
|
|
}
|
|
|
|
private static List<Range> GetFreshRanges(List<string> lines) => lines
|
|
.TakeWhile(line => !string.IsNullOrEmpty(line))
|
|
.Select(range => range.Split('-').Select(long.Parse).ToArray())
|
|
.Select(v => new Range(v))
|
|
.ToList();
|
|
|
|
private static bool IsFresh(long id, IEnumerable<Range> ranges) => ranges.Any(range => IsFresh(id, range));
|
|
|
|
private static bool IsFresh(long id, Range range) => id >= range.From && id <= range.To;
|
|
|
|
private sealed class Range(long[] values)
|
|
{
|
|
public long From { get; } = values[0];
|
|
public long To { get; set; } = values[1];
|
|
}
|
|
} |