Files
AdventOfCode/Days/Day3.cs
2025-12-03 20:56:17 +01:00

120 lines
3.6 KiB
C#

using Spectre.Console;
namespace AdventOfCode.Days;
public class Day3 : Day
{
public override int Number => 3;
public override string Name => "Lobby";
public override void RunPart1(bool display = true)
{
var totalOutputJoltage = 0L;
Span<int> bank = stackalloc int[100];
foreach (var line in Input.EnumerateLines())
{
// Parse the line into battery values
for (var i = 0; i < bank.Length; i++)
{
bank[i] = line[i] - '0';
}
// The first digit the joltage value will be the "left-most" biggest number we can find
var firstDigitMax = bank[0];
var firstDigitMaxIndex = 0;
for (var i = 1; i < bank.Length - 1; i++)
{
var batteryValue = bank[i];
if (batteryValue > firstDigitMax)
{
firstDigitMax = batteryValue;
firstDigitMaxIndex = i;
// We cannot have a digit bigger than 9
if (batteryValue is 9)
{
break;
}
}
}
// Now we can find the second digit which will be the biggest digit on the right of the first one
var secondDigitMax = bank[firstDigitMaxIndex + 1];
for (var i = firstDigitMaxIndex + 2; i < bank.Length; i++)
{
var batteryValue = bank[i];
if (batteryValue > secondDigitMax)
{
secondDigitMax = batteryValue;
if (batteryValue is 9)
{
break;
}
}
}
// Build the joltage value
totalOutputJoltage += firstDigitMax * 10 + secondDigitMax;
}
if (display)
{
AnsiConsole.MarkupLine($"[green]The total output joltage is: [yellow]{totalOutputJoltage}[/][/]");
}
}
public override void RunPart2(bool display = true)
{
var totalOutputJoltage = 0L;
Span<int> bank = stackalloc int[100];
foreach (var line in Input.EnumerateLines())
{
// Parse the line into battery values
for (var i = 0; i < bank.Length; i++)
{
bank[i] = line[i] - '0';
}
var maxIndex = -1;
for (var digitPosition = 11; digitPosition >= 0; digitPosition--)
{
// Next max is always on the right of previous one
maxIndex++;
// Find biggest battery value on the right
var max = bank[maxIndex];
for (var i = maxIndex + 1; i < bank.Length - digitPosition; i++)
{
var batteryValue = bank[i];
if (batteryValue > max)
{
maxIndex = i;
max = batteryValue;
// We cannot have a digit bigger than 9
if (batteryValue is 9)
{
break;
}
}
}
// Directly add its value to the total, we don't need to do compound sum
totalOutputJoltage += max * (long) Math.Pow(10, digitPosition);
}
}
if (display)
{
AnsiConsole.MarkupLine($"[green]The total output joltage is: [yellow]{totalOutputJoltage}[/][/]");
}
}
}