Files
AdventOfCode/Days/Day1.cs
2024-06-03 17:29:56 +02:00

100 lines
2.8 KiB
C#

using Spectre.Console;
namespace AdventOfCode.Days;
public class Day1 : Day
{
public override int Number => 1;
public override string Name => "Trebuchet?!";
private static readonly (string, int)[] WrittenDigits =
[
("one" , 1),
("two" , 2),
("three", 3),
("four" , 4),
("five" , 5),
("six" , 6),
("seven", 7),
("eight", 8),
("nine" , 9)
];
public override void RunPart1(bool display = true)
{
var calibrationSum = 0;
foreach (var line in Input.AsSpan().EnumerateLines())
{
var firstDigitIndex = line.IndexOfAnyInRange('0', '9');
var lastDigitIndex = line.LastIndexOfAnyInRange('0', '9');
var firstDigit = line[firstDigitIndex] - '0';
var lastDigit = line[lastDigitIndex] - '0';
calibrationSum += firstDigit * 10 + lastDigit;
}
if (display)
{
AnsiConsole.MarkupLine($"[green]Sum of calibration values is: [yellow]{calibrationSum}[/][/]");
}
}
public override void RunPart2(bool display = true)
{
var calibrationSum = 0;
foreach (var line in Input.AsSpan().EnumerateLines())
{
var minFirstDigitIndex = line.IndexOfAnyInRange('0', '9');
var maxLastDigitIndex = line.LastIndexOfAnyInRange('0', '9');
var firstDigitValue = 0;
if (minFirstDigitIndex == -1)
{
minFirstDigitIndex = int.MaxValue;
}
else
{
firstDigitValue = line[minFirstDigitIndex] - '0';
}
var lastDigitValue = 0;
if (maxLastDigitIndex == -1)
{
maxLastDigitIndex = int.MinValue;
}
else
{
lastDigitValue = line[maxLastDigitIndex] - '0';
}
foreach (var (writtenDigit, value) in WrittenDigits)
{
var firstWrittenDigitIndex = line.IndexOf(writtenDigit);
if (firstWrittenDigitIndex != -1 && firstWrittenDigitIndex < minFirstDigitIndex)
{
minFirstDigitIndex = firstWrittenDigitIndex;
firstDigitValue = value;
}
var lastWrittenDigitIndex = line.LastIndexOf(writtenDigit);
if (lastWrittenDigitIndex != -1 && lastWrittenDigitIndex > maxLastDigitIndex)
{
maxLastDigitIndex = lastWrittenDigitIndex;
lastDigitValue = value;
}
}
calibrationSum += 10 * firstDigitValue + lastDigitValue;
}
if (display)
{
AnsiConsole.MarkupLine($"[green]Sum of calibration values is: [yellow]{calibrationSum}[/][/]");
}
}
}