Skip to content

Commit 096ccf9

Browse files
committed
Optimize 2024 day 6 part 2 with BrentCycleFinder
1 parent 752f075 commit 096ccf9

File tree

1 file changed

+15
-7
lines changed
  • src/main/scala/eu/sim642/adventofcode2024

1 file changed

+15
-7
lines changed

src/main/scala/eu/sim642/adventofcode2024/Day6.scala

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
package eu.sim642.adventofcode2024
22

3+
import eu.sim642.adventofcode2018.Day13.DirectionPos
34
import eu.sim642.adventofcodelib.Grid
4-
import eu.sim642.adventofcodelib.pos.Pos
55
import eu.sim642.adventofcodelib.GridImplicits.*
6-
import eu.sim642.adventofcode2018.Day13.DirectionPos
7-
import eu.sim642.adventofcodelib.box.Box
8-
import eu.sim642.adventofcodelib.cycle.NaiveCycleFinder
6+
import eu.sim642.adventofcodelib.cycle.BrentCycleFinder
7+
import eu.sim642.adventofcodelib.pos.Pos
98

109
object Day6 {
1110

@@ -34,9 +33,18 @@ object Day6 {
3433
def countGuardPoss(input: Input): Int = guardPoss(input).size
3534

3635
def isGuardCycle(input: Input): Boolean = {
37-
val it = iterateGuard(input).takeWhile(guard => input.grid.containsPos(guard.pos))
38-
val cycle = NaiveCycleFinder.find(it)
39-
cycle.isDefined
36+
37+
// wrapper to turn out-of-grid into None-cycle
38+
// TODO: allow ending sequence with Floyd/Brent
39+
// TODO: allow LazyList with Floyd/Brent
40+
def stepGuardOption(guardOption: Option[Guard]): Option[Guard] = {
41+
guardOption
42+
.map(stepGuard(input.grid))
43+
.filter(guard => input.grid.containsPos(guard.pos))
44+
}
45+
46+
val cycle = BrentCycleFinder.find(Some(input.guard), stepGuardOption)
47+
cycle.cycleHead.isDefined
4048
}
4149

4250
def countObstructionPoss(input: Input): Int = { // TODO: optimize?

0 commit comments

Comments
 (0)