Files
AdventOfCode/Days/Day3.cs
2025-01-24 10:19:11 +01:00

109 lines
3.0 KiB
C#

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