|
1 | 1 | package eu.sim642.adventofcode2024 |
2 | 2 |
|
| 3 | +import eu.sim642.adventofcode2018.Day13.DirectionPos |
3 | 4 | import eu.sim642.adventofcodelib.Grid |
4 | | -import eu.sim642.adventofcodelib.pos.Pos |
5 | 5 | 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 |
9 | 8 |
|
10 | 9 | object Day6 { |
11 | 10 |
|
@@ -34,9 +33,18 @@ object Day6 { |
34 | 33 | def countGuardPoss(input: Input): Int = guardPoss(input).size |
35 | 34 |
|
36 | 35 | 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 |
40 | 48 | } |
41 | 49 |
|
42 | 50 | def countObstructionPoss(input: Input): Int = { // TODO: optimize? |
|
0 commit comments