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}[/][/]"); } } }