|
1 | 1 | package eu.sim642.adventofcode2025 |
2 | 2 |
|
| 3 | +import scala.collection.mutable |
| 4 | + |
3 | 5 | object Day3 { |
4 | 6 |
|
5 | 7 | type Bank = String |
6 | 8 |
|
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 |
15 | 30 | } |
16 | 31 |
|
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 | + } |
18 | 39 |
|
19 | 40 | def parseBanks(input: String): Seq[Bank] = input.linesIterator.toSeq |
20 | 41 |
|
21 | 42 | lazy val input: String = scala.io.Source.fromInputStream(getClass.getResourceAsStream("day3.txt")).mkString.trim |
22 | 43 |
|
23 | 44 | def main(args: Array[String]): Unit = { |
24 | | - println(totalJoltage(parseBanks(input))) |
| 45 | + println(Part1.totalJoltage(parseBanks(input))) |
| 46 | + println(Part2.totalJoltage(parseBanks(input))) |
25 | 47 |
|
26 | 48 | // part 1: 16769 - not right (combinations don't keep order) |
27 | 49 | } |
|
0 commit comments