Add day 7

This commit is contained in:
2025-01-24 10:19:11 +01:00
parent 9920041301
commit 9b865a12b1
4 changed files with 976 additions and 8 deletions

View File

@@ -14,26 +14,25 @@ public class Day5 : Day
var precedences = new HashSet<int>?[100];
var readingPrecedences = true;
foreach (var line in Input.ReadAllLines())
foreach (var line in Input.AsSpan().EnumerateLines())
{
if (string.IsNullOrWhiteSpace(line))
if (line.IsWhiteSpace())
{
readingPrecedences = false;
continue;
}
var span = line.AsSpan();
if (readingPrecedences)
{
var split = span.Split('|');
var split = line.Split('|');
split.MoveNext();
var ruleTarget = int.Parse(span[split.Current]);
var ruleTarget = int.Parse(line[split.Current]);
split.MoveNext();
var ruleNumber = int.Parse(span[split.Current]);
var ruleNumber = int.Parse(line[split.Current]);
if (precedences[ruleTarget] is not { } precedenceSet)
{
@@ -47,7 +46,7 @@ public class Day5 : Day
}
else
{
result += CheckLine(span);
result += CheckLine(line);
}
}

View File

@@ -129,7 +129,7 @@ public class Day6 : Day
Point start = default;
var y = 0;
foreach (var line in Input.ReadAllLines())
foreach (var line in Input.AsSpan().EnumerateLines())
{
var x = 0;

119
Days/Day7.cs Normal file
View File

@@ -0,0 +1,119 @@
using Spectre.Console;
namespace AdventOfCode.Days;
public class Day7 : Day
{
public override int Number => 7;
public override string Name => "Bridge Repair";
public override void RunPart1(bool display = true)
{
var calibrationResult = 0L;
foreach (var line in Input.AsSpan().EnumerateLines())
{
// Read input equation
var equationStart = line.IndexOf(':');
var target = long.Parse(line[..equationStart]);
var numbers = new List<long>();
var equationNumbers = line[(equationStart + 2)..];
foreach (var range in equationNumbers.Split(' '))
{
numbers.Add(int.Parse(equationNumbers[range]));
}
// Check if equation is possible
if (CheckEquation(target, numbers.ToArray().AsSpan()[1..], numbers[0]))
{
calibrationResult += target;
}
}
if (display)
{
AnsiConsole.MarkupLine($"[green]Total calibration result: [yellow]{calibrationResult}[/][/]");
}
return;
bool CheckEquation(long target, ReadOnlySpan<long> numbers, long result)
{
// Early return when result is greater than target because result is increasing
if (result > target)
{
return false;
}
if (numbers.IsEmpty)
{
return result == target;
}
var sumResult = result + numbers[0];
var multiplyResult = result * numbers[0];
return CheckEquation(target, numbers[1..], sumResult)
|| CheckEquation(target, numbers[1..], multiplyResult);
}
}
public override void RunPart2(bool display = true)
{
var calibrationResult = 0L;
foreach (var line in Input.AsSpan().EnumerateLines())
{
// Read input equation
var equationStart = line.IndexOf(':');
var target = long.Parse(line[..equationStart]);
var numbers = new List<long>();
var equationNumbers = line[(equationStart + 2)..];
foreach (var range in equationNumbers.Split(' '))
{
numbers.Add(int.Parse(equationNumbers[range]));
}
// Check if equation is possible
if (CheckEquation(target, numbers.ToArray().AsSpan()[1..], numbers[0]))
{
calibrationResult += target;
}
}
if (display)
{
AnsiConsole.MarkupLine($"[green]Total calibration result: [yellow]{calibrationResult}[/][/]");
}
return;
bool CheckEquation(long target, ReadOnlySpan<long> numbers, long result)
{
// Early return when result is greater than target because result is increasing
if (result > target)
{
return false;
}
if (numbers.IsEmpty)
{
return result == target;
}
var sumResult = result + numbers[0];
var multiplyResult = result * numbers[0];
var concatResult = result * (int)Math.Pow(10, (int)Math.Log10(numbers[0]) + 1) + numbers[0];
return CheckEquation(target, numbers[1..], sumResult)
|| CheckEquation(target, numbers[1..], multiplyResult)
|| CheckEquation(target, numbers[1..], concatResult);
}
}
}