Add AoC 2025 project structure and first solutions
This commit is contained in:
@@ -0,0 +1,88 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using AdvenOfCode.Contracts;
|
||||
|
||||
namespace AoC_2025;
|
||||
|
||||
public class Day03 : IPuzzleSolver<long>
|
||||
{
|
||||
private string[] ParsePuzzleInput(string path)
|
||||
{
|
||||
var puzzleInput = File.ReadAllLines(path)
|
||||
.Where(line => !string.IsNullOrWhiteSpace(line))
|
||||
.ToArray();
|
||||
return puzzleInput;
|
||||
}
|
||||
|
||||
public long SolvePart1(string pathToPuzzleInput)
|
||||
{
|
||||
var batterieBankStrings = ParsePuzzleInput(pathToPuzzleInput);
|
||||
var batterieBanks = batterieBankStrings.Select(bbs => ParseBatterieBank(bbs));
|
||||
var voltages = batterieBanks.Select(bb => FindMaxVoltage(bb));
|
||||
var sumVoltages = voltages.Sum();
|
||||
return sumVoltages;
|
||||
}
|
||||
|
||||
public long SolvePart2(string pathToPuzzleInput)
|
||||
{
|
||||
const int voltageLength = 12;
|
||||
var batterieBankStrings = ParsePuzzleInput(pathToPuzzleInput);
|
||||
var batterieBanks = batterieBankStrings.Select(bbs => ParseBatterieBank(bbs));
|
||||
var voltages = batterieBanks.Select(bb => GetMaxSuperVoltage(bb, voltageLength));
|
||||
var sumVoltages = voltages.Sum();
|
||||
return sumVoltages;
|
||||
}
|
||||
|
||||
private int[] ParseBatterieBank(string batterieBank)
|
||||
{
|
||||
return batterieBank
|
||||
.Select(c => new string(c, 1))
|
||||
.Select(value => int.Parse(value))
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
private long FindMaxVoltage(Span<int> batterieBank)
|
||||
{
|
||||
var (firstNumber, position) = GetMax(batterieBank[..^1]);
|
||||
var (secondNumber, _) = GetMax(batterieBank[(position + 1)..]);
|
||||
var voltage = Combine(firstNumber, secondNumber);
|
||||
return voltage;
|
||||
}
|
||||
|
||||
private long Combine(long first, long second)
|
||||
{
|
||||
return (first * 10) + second;
|
||||
}
|
||||
|
||||
private long GetMaxSuperVoltage(Span<int> batterieBank, int voltageLength)
|
||||
{
|
||||
var indexedVoltageLength = voltageLength - 1;
|
||||
var currentBankPosition = 0;
|
||||
var superVoltage = 0L;
|
||||
for (var i = 0; i < voltageLength; i++)
|
||||
{
|
||||
var (max, numberPosition) = GetMax(batterieBank[currentBankPosition..^(indexedVoltageLength - i)]);
|
||||
superVoltage = Combine(superVoltage, max);
|
||||
currentBankPosition += numberPosition + 1;
|
||||
}
|
||||
|
||||
return superVoltage;
|
||||
}
|
||||
|
||||
private (int max, int currentPosition) GetMax(Span<int> batterieBank)
|
||||
{
|
||||
var max = batterieBank[0];
|
||||
var currentPosition = 0;
|
||||
for (var i = 1; i < batterieBank.Length; i++)
|
||||
{
|
||||
if (max < batterieBank[i])
|
||||
{
|
||||
max = batterieBank[i];
|
||||
currentPosition = i;
|
||||
}
|
||||
}
|
||||
|
||||
return (max, currentPosition);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user