Today was interesting. My first thought was that part 2 would be a lot more complex at first glance. But I realized that my solution for part 1 worked almost out of the box for part 2.
I was also pleased to see that the algorithm ran in 1ms, which was a good deal faster than just parsing the input.
fun main() {
val input = getInput(3)
val banks = parseInput(input)
var total = 0L
banks.forEach { bank ->
var location = 0
var joltage = 0L
for (power in 11 downTo 0) {
val multiplier = 10.toDouble().pow(power).toLong()
val batteryLocation = findBattery(bank, location, bank.size - power - 1)
val battery = bank[batteryLocation]
location = batteryLocation + 1
joltage += battery.toLong() * multiplier
}
total += joltage
}
println(total)
}
fun parseInput(input: String): List<List<Int>> = input
.split("\n")
.filter { it.isNotBlank() }
.map { it.toCharArray() }
.map { it.map { digit -> digit.digitToInt() } }
fun findBattery(bank: List<Int>, start: Int, end: Int): Int {
var max = 0
var location = 0
for (i in start..end) {
val battery = bank[i]
if (battery > max) {
max = battery
location = i
if (battery == 9) {
break
}
}
}
return location
}