This commit is contained in:
2025-12-05 20:00:59 -05:00
parent 9f1a2d2300
commit e56befa18b

View File

@@ -0,0 +1,85 @@
using System;
using System.Collections.Generic;
using System.Text;
using ZLinq;
namespace AdventOfCode.Problems.AOC2025.Day5;
[ProblemInfo(2025, 5, "Cafeteria")]
internal class Cafeteria : Problem<long, long>
{
private (long start, long end)[] _ranges = [];
private long[] _values = [];
public override void CalculatePart1()
{
Part1 = _values.AsValueEnumerable().Count(v => _ranges.AsValueEnumerable().Any(r => IsInRange(r, v)));
}
public static bool IsInRange((long start, long end) range, long value)
{
return (range.start <= value && range.end >= value);
}
public override void CalculatePart2()
{
var merged = MergeRanges(_ranges);
merged.Print();
Console.WriteLine("----");
MergeRanges(merged.ToArray()).Print();
//merged.Print();
Part2 = merged.Select(r => r.end - r.start + 1).Sum();
}
public static List<(long start, long end)> MergeRanges((long start, long end)[] ranges)
{
var result = new List<(long start, long end)>(ranges.Length);
var used = new HashSet<int>();
for (int i = 0; i < ranges.Length; i++)
{
if (used.Contains(i))
continue;
var range = ranges[i];
for (int j = (i + 1); j < ranges.Length; j++)
{
if (used.Contains(j))
continue;
var range2 = ranges[j];
if(IsOverlapping(range, range2))
{
range = Merge(range, range2);
used.Add(j);
j = i;
}
}
result.Add(range);
}
return result;
}
public static bool IsOverlapping((long start, long end) a, (long start, long end) b)
{
return IsInRange(a, b.start) || IsInRange(a, b.end) || IsInRange(b, a.start) || IsInRange(b, a.end);
}
public static (long start, long end) Merge((long start, long end) a, (long start, long end) b)
{
return (a.start.Min(b.start), a.end.Max(b.end));
}
public override void LoadInput()
{
var lines = ReadInputLines("input.txt");
_ranges = lines
.TakeWhile(l => !string.IsNullOrWhiteSpace(l))
.Select(l => l.Split('-').Select(long.Parse))
.Select(v => (start: v.First(), end: v.Last()))
.ToArray();
_values = lines[(_ranges.Length + 1)..]
.Select(long.Parse)
.ToArray();
}
}