using Spectre.Console; namespace AdventOfCode.Days; public class Day3 : Day { public override int Number => 3; public override string Name => "Mull It Over"; public override void RunPart1(bool display = true) { var result = 0; var input = Input.AsSpan(); var mulStart = input.IndexOf("mul("); while (mulStart != -1) { input = input[(mulStart + 4)..]; // Start of a mul operation, search the ending parenthesis and make sure it's before the next mul var mulEnd = input.IndexOf(")"); var nextMulStart = input.IndexOf("mul("); if (mulEnd != -1 && (nextMulStart == -1 || mulEnd < nextMulStart)) { var operands = input[..mulEnd]; var separator = operands.IndexOf(","); if (separator != -1 && int.TryParse(operands[..separator], out var left) && int.TryParse(operands[(separator + 1)..], out var right)) { result += left * right; } } mulStart = nextMulStart; } if (display) { AnsiConsole.MarkupLine($"[green]Result: [yellow]{result}[/][/]"); } } public override void RunPart2(bool display = true) { var result = 0; var input = Input.AsSpan(); var mulStart = input.IndexOf("mul("); while (mulStart != -1) { // Check if there is a "don't()" before next mul var dontStart = input.IndexOf("don't()"); if (dontStart < mulStart) { // Search for next "do()" input = input[(dontStart + 7)..]; var doStart = input.IndexOf("do()"); if (doStart == -1) { break; } input = input[(doStart + 4)..]; // Update next mult position mulStart = input.IndexOf("mul("); if (mulStart == -1) { break; } } input = input[(mulStart + 4)..]; // Start of a mul operation, search the ending parenthesis and make sure it's before the next mul var mulEnd = input.IndexOf(")"); var nextMulStart = input.IndexOf("mul("); if (mulEnd != -1 && (nextMulStart == -1 || mulEnd < nextMulStart)) { var operands = input[..mulEnd]; var separator = operands.IndexOf(","); if (separator != -1 && int.TryParse(operands[..separator], out var left) && int.TryParse(operands[(separator + 1)..], out var right)) { result += left * right; } } mulStart = nextMulStart; } if (display) { AnsiConsole.MarkupLine($"[green]Result: [yellow]{result}[/][/]"); } } }