Skip to content

Commit b27b7da

Browse files
committed
Optimize bifurcate solution in 2025 day 10 part 2 by memoization
1 parent 466402f commit b27b7da

File tree

1 file changed

+16
-11
lines changed

1 file changed

+16
-11
lines changed

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

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import com.microsoft.z3.{ArithExpr, Context, IntSort, Status}
44
import eu.sim642.adventofcodelib.GaussianElimination
55
import eu.sim642.adventofcodelib.graph.{BFS, GraphSearch, TargetNode, UnitNeighbors}
66

7+
import scala.collection.mutable
78
import scala.jdk.CollectionConverters.*
89

910
object Day10 {
@@ -170,18 +171,22 @@ object Day10 {
170171
.groupBy((joltages, _) => parity(joltages))
171172
.withDefaultValue(Seq.empty)
172173

174+
val memo = mutable.Map.empty[Joltages, Option[Int]] // memoization is a bonus, but not strictly necessary
175+
173176
def helper(joltages: Joltages): Option[Int] = {
174-
if (joltages == zeroJoltages)
175-
Some(0)
176-
else if (joltages.exists(_ < 0))
177-
None
178-
else {
179-
(for {
180-
(pressJoltages, presses) <- parityPresses(parity(joltages))
181-
newJoltages = (joltages lazyZip pressJoltages).map(_ - _).map(_ / 2)
182-
newPresses <- helper(newJoltages)
183-
} yield 2 * newPresses + presses).minOption
184-
}
177+
memo.getOrElseUpdate(joltages, {
178+
if (joltages == zeroJoltages)
179+
Some(0)
180+
else if (joltages.exists(_ < 0))
181+
None
182+
else {
183+
(for {
184+
(pressJoltages, presses) <- parityPresses(parity(joltages))
185+
newJoltages = (joltages lazyZip pressJoltages).map(_ - _).map(_ / 2)
186+
newPresses <- helper(newJoltages)
187+
} yield 2 * newPresses + presses).minOption
188+
}
189+
})
185190
}
186191

187192
helper(machine.joltages).get

0 commit comments

Comments
 (0)