Skip to content

Commit 7acad03

Browse files
committed
Solve 2025 day 3 part 2
1 parent 983eb8d commit 7acad03

File tree

2 files changed

+45
-12
lines changed

2 files changed

+45
-12
lines changed

src/main/scala/eu/sim642/adventofcode2025/Day3.scala

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,49 @@
11
package eu.sim642.adventofcode2025
22

3+
import scala.collection.mutable
4+
35
object Day3 {
46

57
type Bank = String
68

7-
def maxJoltage(bank: Bank): Int = {
8-
// TODO: doesn't keep order
9-
//bank.combinations(2).map(_.toInt).max
10-
// TODO: can be made linearly?
11-
(for {
12-
i <- bank.indices
13-
j <- (i + 1) until bank.length
14-
} yield s"${bank(i)}${bank(j)}".toInt).max
9+
def maxJoltageDigits(bank: Bank, digits: Int): Long = {
10+
val memo = mutable.Map.empty[(Int, Int), Long]
11+
12+
def helper(i: Int, digits: Int): Long = {
13+
memo.getOrElseUpdate((i, digits), {
14+
if (i >= 0 && digits >= 1) {
15+
helper(i - 1, digits) max (helper(i - 1, digits - 1) * 10 + bank(i).asDigit)
16+
} else
17+
0
18+
})
19+
}
20+
21+
helper(bank.length - 1, digits)
22+
}
23+
24+
trait Part {
25+
val digits: Int
26+
27+
def maxJoltage(bank: Bank): Long = maxJoltageDigits(bank, digits)
28+
29+
def totalJoltage(banks: Seq[Bank]): Long = banks.map(maxJoltage).sum
1530
}
1631

17-
def totalJoltage(banks: Seq[Bank]): Int = banks.map(maxJoltage).sum
32+
object Part1 extends Part {
33+
override val digits: Int = 2
34+
}
35+
36+
object Part2 extends Part {
37+
override val digits: Int = 12
38+
}
1839

1940
def parseBanks(input: String): Seq[Bank] = input.linesIterator.toSeq
2041

2142
lazy val input: String = scala.io.Source.fromInputStream(getClass.getResourceAsStream("day3.txt")).mkString.trim
2243

2344
def main(args: Array[String]): Unit = {
24-
println(totalJoltage(parseBanks(input)))
45+
println(Part1.totalJoltage(parseBanks(input)))
46+
println(Part2.totalJoltage(parseBanks(input)))
2547

2648
// part 1: 16769 - not right (combinations don't keep order)
2749
}

src/test/scala/eu/sim642/adventofcode2025/Day3Test.scala

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,21 @@ class Day3Test extends AnyFunSuite {
1212
|818181911112111""".stripMargin
1313

1414
test("Part 1 examples") {
15-
assert(totalJoltage(parseBanks(exampleInput)) == 357)
15+
assert(Part1.maxJoltage("98") == 98)
16+
assert(Part1.maxJoltage("987") == 98)
17+
assert(Part1.totalJoltage(parseBanks(exampleInput)) == 357)
1618
}
1719

1820
test("Part 1 input answer") {
19-
assert(totalJoltage(parseBanks(input)) == 17301)
21+
assert(Part1.totalJoltage(parseBanks(input)) == 17301)
22+
}
23+
24+
test("Part 2 examples") {
25+
assert(Part2.maxJoltage("987654321111111") == 987654321111L)
26+
assert(Part2.totalJoltage(parseBanks(exampleInput)) == 3121910778619L)
27+
}
28+
29+
test("Part 2 input answer") {
30+
assert(Part2.totalJoltage(parseBanks(input)) == 172162399742349L)
2031
}
2132
}

0 commit comments

Comments
 (0)