using System; using System.IO; using System.Linq; using AdvenOfCode.Contracts; namespace AoC_2025; public class Day03 : IPuzzleSolver { 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 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 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 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); } }