120 lines
3.6 KiB
C#
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}[/][/]");
|
|
}
|
|
}
|
|
} |