[2k25] Add day 1

This commit is contained in:
2025-12-01 22:14:56 +01:00
parent f8843866ca
commit 0c3a8478d4
51 changed files with 4819 additions and 24970 deletions

View File

@@ -1,121 +0,0 @@
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<int>?[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<char> line)
{
Span<int> 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}[/][/]");
// }
}
}