AdventOfCode2025/AdventOfCode2025/Solutions/Day5.cs

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];
}
}