@@ -4,6 +4,7 @@ import com.microsoft.z3.{ArithExpr, Context, IntSort, Status}
44import eu .sim642 .adventofcodelib .GaussianElimination
55import eu .sim642 .adventofcodelib .graph .{BFS , GraphSearch , TargetNode , UnitNeighbors }
66
7+ import scala .collection .mutable
78import scala .jdk .CollectionConverters .*
89
910object 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