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