Skip to content

Commit 3950130

Browse files
committed
Optimize Gaussian elimination solution in 2025 day 10 part 2 by using maximum button bounds
1 parent 69efb44 commit 3950130

File tree

1 file changed

+16
-24
lines changed

1 file changed

+16
-24
lines changed

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

Lines changed: 16 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -207,16 +207,18 @@ object Day10 {
207207

208208
//val mSum = m.transpose.map(_.sum) // TODO: use?
209209

210-
def helper0(sum: Int, len: Int): Iterator[List[Int]] = {
211-
if (len == 0)
212-
Iterator(Nil)
213-
else if (len == 1)
214-
Iterator(List(sum))
215-
else {
216-
for {
217-
x <- (0 to sum).iterator
218-
rest <- helper0(sum - x, len - 1)
219-
} yield x :: rest
210+
val maxVals = machine.buttons.map(_.map(machine.joltages(_)).min)
211+
212+
def helper0(sum: Int, maxs: List[Int]): Iterator[List[Int]] = {
213+
maxs match {
214+
case Nil => Iterator(Nil)
215+
case List(m) if sum <= m => Iterator(List(sum))
216+
case List(m) => Iterator.empty
217+
case m :: newMaxs =>
218+
for {
219+
x <- (0 to (m min sum)).iterator
220+
rest <- helper0(sum - x, newMaxs)
221+
} yield x :: rest
220222
}
221223
}
222224

@@ -232,26 +234,16 @@ object Day10 {
232234
mainVals
233235
}
234236

235-
// TODO: avoid double search...
236-
val bound =
237-
Iterator.from(0)
238-
.flatMap(helper0(_, freeVars.size))
239-
.map(freeVals => (eval(freeVals), freeVals))
240-
.filter(_._1.forall(_ >= 0)) // all main vals must be non-negative
241-
.map((s1, s2) => s1.sum + s2.sum)
242-
.head
243-
val choices = (0 to bound.toInt).iterator.flatMap(helper0(_, freeVars.size))
237+
val bound = freeVars.map(maxVals).sum
238+
val choices = (0 to bound).iterator.flatMap(helper0(_, freeVars.map(maxVals).toList))
244239

245240
val answer =
246241
choices
247242
.map(freeVals => (eval(freeVals), freeVals))
248-
//.take(1000) // TODO: when to stop?
249-
//.tapEach(println)
250-
.filter(_._1.forall(_ >= 0)) // all main vals must be non-negative
243+
.filter(p => p._1.forall(_ >= 0) && (p._1 lazyZip mainVars).forall((a, b) => a <= maxVals(b))) // all main vals must be non-negative, but at most their max
251244
.map((s1, s2) => s1.sum + s2.sum)
252-
.min // TODO: wrong, freeVals sum is minimal, but mainVals sum isn't
245+
.min
253246

254-
println(answer)
255247
answer.toInt
256248
}
257249
}

0 commit comments

Comments
 (0)