feat: solved day 5 part 2
This commit is contained in:
@@ -26,10 +26,16 @@ var parseResult = parser.Parse(input);
|
||||
|
||||
var validator = new UpdateValidator(parseResult.Rules);
|
||||
|
||||
var result = parseResult.Updates
|
||||
.Where(u => validator.Validate(u))
|
||||
.Select(u => u.GetMiddlePage())
|
||||
.Sum();
|
||||
var result = isPart2
|
||||
? parseResult.Updates
|
||||
.Where(u => validator.Validate(u) is false)
|
||||
.Select(u => validator.Sort(u))
|
||||
.Select(u => u.GetMiddlePage())
|
||||
.Sum()
|
||||
: parseResult.Updates
|
||||
.Where(u => validator.Validate(u))
|
||||
.Select(u => u.GetMiddlePage())
|
||||
.Sum();
|
||||
|
||||
stopwatch.Stop();
|
||||
Console.WriteLine($"The sum of the page numbers is {result}. ({stopwatch.ElapsedMilliseconds}ms)");
|
||||
@@ -21,6 +21,30 @@ class UpdateValidator
|
||||
Graph[rule.X].Add(rule.Y);
|
||||
}
|
||||
}
|
||||
|
||||
public Update Sort(Update update)
|
||||
{
|
||||
var sortedUpdate = new Update(update.Pages.ToList());
|
||||
|
||||
while (Validate(sortedUpdate) is false)
|
||||
{
|
||||
for (var i = 0; i < sortedUpdate.Pages.Count - 1; i++)
|
||||
{
|
||||
var currentPage = sortedUpdate.Pages[i];
|
||||
var nextPage = sortedUpdate.Pages[i + 1];
|
||||
|
||||
if (IsOutOfOrder(currentPage, nextPage) is false)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
sortedUpdate.Pages[i] = nextPage;
|
||||
sortedUpdate.Pages[i + 1] = currentPage;
|
||||
}
|
||||
}
|
||||
|
||||
return sortedUpdate;
|
||||
}
|
||||
|
||||
public bool Validate(Update update)
|
||||
{
|
||||
@@ -28,20 +52,20 @@ class UpdateValidator
|
||||
|
||||
foreach (var page in update.Pages)
|
||||
{
|
||||
foreach (var previousPage in previousPages)
|
||||
if (previousPages.Any(previousPage => IsOutOfOrder(previousPage, page)))
|
||||
{
|
||||
if (
|
||||
Graph.TryGetValue(previousPage, out HashSet<int>? value) &&
|
||||
value.Contains(page) is false
|
||||
)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
previousPages.Add(page);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private bool IsOutOfOrder(int previousPage, int futurePage)
|
||||
{
|
||||
return Graph.TryGetValue(previousPage, out var dependents) &&
|
||||
dependents.Contains(futurePage) is false;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user