Skip to content

Commit 754d55d

Browse files
committed
Solution 2025-03 (Lobby)
1 parent d21733a commit 754d55d

File tree

2 files changed

+85
-0
lines changed
  • src
    • main/kotlin/de/ronny_h/aoc/year2025/day03
    • test/kotlin/de/ronny_h/aoc/year2025/day03

2 files changed

+85
-0
lines changed
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package de.ronny_h.aoc.year2025.day03
2+
3+
import de.ronny_h.aoc.AdventOfCode
4+
5+
fun main() = Lobby().run(17324, 171846613143331)
6+
7+
class Lobby : AdventOfCode<Long>(2025, 3) {
8+
override fun part1(input: List<String>): Long = input
9+
.parse().sumOf(List<Int>::joltage)
10+
11+
override fun part2(input: List<String>): Long = input
12+
.parse().sumOf(List<Int>::joltageWithSafetyOverride)
13+
}
14+
15+
fun List<Int>.joltage(): Long {
16+
val first = subList(0, lastIndex).max()
17+
val firstIndex = indexOf(first)
18+
val second = subList(firstIndex + 1, size).max()
19+
return "$first$second".toLong()
20+
}
21+
22+
fun List<Int>.joltageWithSafetyOverride(): Long {
23+
var index = -1
24+
val batteriesSwitchedOn = mutableListOf<Int>()
25+
for (remaining in 11 downTo 0) {
26+
val remainingBatteries = subList(index + 1, size - remaining)
27+
val chosenBattery = remainingBatteries.max()
28+
batteriesSwitchedOn.add(chosenBattery)
29+
index += 1 + remainingBatteries.indexOf(chosenBattery)
30+
}
31+
return batteriesSwitchedOn.joinToString("").toLong()
32+
}
33+
34+
fun List<String>.parse() = map { bank ->
35+
bank.map {
36+
it.digitToIntOrNull() ?: error("should never be null")
37+
}
38+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package de.ronny_h.aoc.year2025.day03
2+
3+
import de.ronny_h.aoc.extensions.asList
4+
import io.kotest.core.spec.style.StringSpec
5+
import io.kotest.data.forAll
6+
import io.kotest.data.row
7+
import io.kotest.matchers.shouldBe
8+
9+
class LobbyTest : StringSpec({
10+
11+
val input = """
12+
987654321111111
13+
811111111111119
14+
234234234234278
15+
818181911112111
16+
""".asList()
17+
18+
"joltage" {
19+
forAll(
20+
row(listOf(9, 8, 7, 6, 5, 4, 3, 2, 1, 1, 1, 1, 1, 1, 1), 98),
21+
row(listOf(8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9), 89),
22+
row(listOf(2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 7, 8), 78),
23+
row(listOf(8, 1, 8, 1, 8, 1, 9, 1, 1, 1, 1, 2, 1, 1, 1), 92),
24+
) { bank, expected ->
25+
bank.joltage() shouldBe expected
26+
}
27+
}
28+
29+
"joltageWithSafetyOverride" {
30+
forAll(
31+
row(listOf(9, 8, 7, 6, 5, 4, 3, 2, 1, 1, 1, 1, 1, 1, 1), 987654321111),
32+
row(listOf(8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9), 811111111119),
33+
row(listOf(2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 3, 4, 2, 7, 8), 434234234278),
34+
row(listOf(8, 1, 8, 1, 8, 1, 9, 1, 1, 1, 1, 2, 1, 1, 1), 888911112111),
35+
) { bank, expected ->
36+
bank.joltageWithSafetyOverride() shouldBe expected
37+
}
38+
}
39+
40+
"part 1: the total output joltage" {
41+
Lobby().part1(input) shouldBe 357
42+
}
43+
44+
"part 2: the total output joltage with safety override" {
45+
Lobby().part2(input) shouldBe 3121910778619
46+
}
47+
})

0 commit comments

Comments
 (0)