using Spectre.Console; namespace AdventOfCode.Days; public class Day5 : Day { public override int Number => 5; public override string Name => "Print Queue"; public override void RunPart1(bool display = true) { var result = 0; var precedences = new HashSet?[100]; var readingPrecedences = true; foreach (var line in Input.AsSpan().EnumerateLines()) { if (line.IsWhiteSpace()) { readingPrecedences = false; continue; } if (readingPrecedences) { var split = line.Split('|'); split.MoveNext(); var ruleTarget = int.Parse(line[split.Current]); split.MoveNext(); var ruleNumber = int.Parse(line[split.Current]); if (precedences[ruleTarget] is not { } precedenceSet) { precedenceSet = [ ruleNumber ]; precedences[ruleTarget] = precedenceSet; } else { precedenceSet.Add(ruleNumber); } } else { result += CheckLine(line); } } if (display) { AnsiConsole.MarkupLine($"[green]Sum of middle page numbers: [yellow]{result}[/][/]"); } return; int CheckLine(ReadOnlySpan line) { Span positions = stackalloc int[100]; // Read line to get positions var position = 1; foreach (var range in line.Split(',')) { var number = int.Parse(line[range]); positions[number] = position; position++; } var middlePosition = (position - 1) / 2; var middleNumber = 0; var index = 0; // Check if positions respect precedence rules foreach (var range in line.Split(',')) { var number = int.Parse(line[range]); // Fetch middle number if (index == middlePosition) { middleNumber = number; } index++; if (precedences[number] is not { } precedenceSet) { continue; } var numberPosition = positions[number]; // Check all precedence rules for numbers in the list foreach (var nextNumber in precedenceSet) { var nextNumberPosition = positions[nextNumber]; if (nextNumberPosition != 0 && numberPosition >= nextNumberPosition) { return 0; } } } return middleNumber; } } public override void RunPart2(bool display = true) { // if (display) // { // AnsiConsole.MarkupLine($"[green]Number of safe reports: [yellow]{xmasCount}[/][/]"); // } } }