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