feat: solved day 5 part 2

This commit is contained in:
Stevan Freeborn
2024-12-05 23:47:44 -06:00
parent a9f9dec7aa
commit e359a73266
5 changed files with 85 additions and 18 deletions
+10 -4
View File
@@ -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)");
+33 -9
View File
@@ -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;
}
}