part two completed
This commit is contained in:
@@ -11,11 +11,12 @@ public class Cafeteria : IAdventSolution
|
|||||||
|
|
||||||
var ranges = new HashSet<Range>();
|
var ranges = new HashSet<Range>();
|
||||||
var startIndex = 0;
|
var startIndex = 0;
|
||||||
while (lines[startIndex].Contains("-"))
|
while (lines[startIndex].Contains('-'))
|
||||||
{
|
{
|
||||||
var line = lines[startIndex++];
|
var line = lines[startIndex++];
|
||||||
var parts = line.Split('-');
|
var parts = line.Split('-');
|
||||||
ranges.Add(new(ulong.Parse(parts[0]), ulong.Parse(parts[1])));
|
var range = new Range(ulong.Parse(parts[0]), ulong.Parse(parts[1]));
|
||||||
|
AddRange(ranges, range);
|
||||||
}
|
}
|
||||||
|
|
||||||
var fresh = 0;
|
var fresh = 0;
|
||||||
@@ -26,10 +27,54 @@ public class Cafeteria : IAdventSolution
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
var num = ulong.Parse(line);
|
var num = ulong.Parse(line);
|
||||||
if(ranges.Any(x => x.Min <= num && num <= x.Max)) fresh++;
|
if(ranges.Any(x => x.IsInRange(num))) fresh++;
|
||||||
|
}
|
||||||
|
RemoveExtraRanges(ranges);
|
||||||
|
var totalFresh = 0UL;
|
||||||
|
foreach (var range in ranges)
|
||||||
|
totalFresh += range.InclusiveCount;
|
||||||
|
|
||||||
|
return new AdventSolution(fresh.ToString(), totalFresh.ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void AddRange(HashSet<Range> ranges, Range range)
|
||||||
|
{
|
||||||
|
var first = ranges.FirstOrDefault(x => x.IsInRange(range.Min));
|
||||||
|
if (first != default)
|
||||||
|
{
|
||||||
|
ranges.Remove(first);
|
||||||
|
if(!first.IsInRange(range.Max))
|
||||||
|
first = new Range(first.Min, range.Max);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
first = range;
|
||||||
|
|
||||||
return new AdventSolution(fresh.ToString(), null);
|
var last = ranges.LastOrDefault(x => x.IsInRange(first.Max));
|
||||||
|
if (last != default)
|
||||||
|
{
|
||||||
|
ranges.Remove(last);
|
||||||
|
if (!last.IsInRange(first.Min))
|
||||||
|
last = new Range(first.Min, last.Max);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
last = first;
|
||||||
|
|
||||||
|
ranges.Add(last);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void RemoveExtraRanges(HashSet<Range> ranges)
|
||||||
|
{
|
||||||
|
var toRemove = new List<Range>();
|
||||||
|
foreach (var range in ranges)
|
||||||
|
{
|
||||||
|
if(ranges.Any(x => x != range && (x.IsInRange(range.Min) || x.IsInRange(range.Max))))
|
||||||
|
toRemove.Add(range);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var remove in toRemove)
|
||||||
|
{
|
||||||
|
ranges.Remove(remove);
|
||||||
|
AddRange(ranges, remove);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -14,5 +14,5 @@ AdventSolver<Lobby>.Solve(dayThreeInput, 3, "Lobby");
|
|||||||
var dayFourInput = await File.ReadAllTextAsync("./Input/DayFour.txt");
|
var dayFourInput = await File.ReadAllTextAsync("./Input/DayFour.txt");
|
||||||
AdventSolver<PrintingDepartment>.Solve(dayFourInput, 4, "Printing Department");
|
AdventSolver<PrintingDepartment>.Solve(dayFourInput, 4, "Printing Department");
|
||||||
|
|
||||||
var dayFiveInput = await File.ReadAllTextAsync("./Input/Test.txt");
|
var dayFiveInput = await File.ReadAllTextAsync("./Input/DayFive.txt");
|
||||||
AdventSolver<Cafeteria>.Solve(dayFiveInput, 4, "Cafeteria");
|
AdventSolver<Cafeteria>.Solve(dayFiveInput, 4, "Cafeteria");
|
||||||
Reference in New Issue
Block a user