88 lines
2.7 KiB
C#
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);
|
|
}
|
|
} |