Nim
type
AOCSolution[T,U] = tuple[part1: T, part2: U]
proc maxJoltage(bank: string, n: int): int =
var index = 0
for leftover in countDown(n-1, 0):
var best = bank[index]
for batteryInd in index+1 .. bank.high-leftover:
let batt = bank[batteryInd]
if batt > best: (best = batt; index = batteryInd)
if best == '9': break # max for single battery
result += (best.ord - '0'.ord) * 10^leftover
inc index
proc solve(input: string): AOCSolution[int, int] =
for line in input.splitLines:
result.part1 += line.maxJoltage 2
result.part2 += line.maxJoltage 12
Runtime: ~240 ฮผs
Day 3 was very straightforward, although I did wrestle a bit with the indexing.
Honestly, I expected part 2 to require dynamic programming, but it turned out I only needed to tweak a few numbers in my part 1 code.
Full solution at Codeberg: solution.nim