I've been watching Pluribus the last few weeks. I've been enjoying it a lot.
Anyway, Part 1 is easy, just find if any range fits for the ingredient.
private bool IsFresh(long ingredient)
{
return freshRanges.Any(range => range.Item1 <= ingredient && ingredient <= range.Item2);
}
And Part 2 is also pretty easy. Almost dissapointingly easy...
The naieve approach would be to enumerate all of them, but there's already so many. The first thing to do would be to combine all of the ranges that overlap (honestly something that would speed up part 1 as well), then simply count the size of each range.
if (Math.Max(range.Item1, newRange.Item1) <= Math.Min(range.Item2, newRange.Item2))
{
ranges.Remove(range);
var newRange = (Math.Min(range.Item1, newRange.Item1), Math.Max(range.Item2, newRange.Item2));
}
That's a simplified form, but basically repeat that until no more ranges merge. The entire thing took less than 10ms to run, when counting something like a 15-digit number for the answer.