AdventOfCode/AoC_2025/Day03.cs

88 lines
2.7 KiB
C#

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);
}
}