Add day 5

This commit is contained in:
2025-01-24 10:19:11 +01:00
parent ca58bd804b
commit 323bb83e56
3 changed files with 1505 additions and 0 deletions

View File

@@ -18,4 +18,8 @@
<EmbeddedResource Include="Inputs\*" />
</ItemGroup>
<ItemGroup>
<Content Include="Inputs\Day5.txt" />
</ItemGroup>
</Project>

122
Days/Day5.cs Normal file
View File

@@ -0,0 +1,122 @@
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.ReadAllLines())
{
if (string.IsNullOrWhiteSpace(line))
{
readingPrecedences = false;
continue;
}
var span = line.AsSpan();
if (readingPrecedences)
{
var split = span.Split('|');
split.MoveNext();
var ruleTarget = int.Parse(span[split.Current]);
split.MoveNext();
var ruleNumber = int.Parse(span[split.Current]);
if (precedences[ruleTarget] is not { } precedenceSet)
{
precedenceSet = [ ruleNumber ];
precedences[ruleTarget] = precedenceSet;
}
else
{
precedenceSet.Add(ruleNumber);
}
}
else
{
result += CheckLine(span);
}
}
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}[/][/]");
// }
}
}

1379
Inputs/Day5.txt Normal file

File diff suppressed because it is too large Load Diff