diff --git a/aoc/src/dev/ctsk/aoc/days/Day16.scala b/aoc/src/dev/ctsk/aoc/days/Day16.scala index 8b81030..63deefc 100644 --- a/aoc/src/dev/ctsk/aoc/days/Day16.scala +++ b/aoc/src/dev/ctsk/aoc/days/Day16.scala @@ -3,6 +3,8 @@ package dev.ctsk.aoc.days import dev.ctsk.aoc.{Direction, *} import scala.collection.mutable +import scala.util.boundary +import scala.util.boundary.break object Day16 extends Solver(16): override def run(input_ : os.ReadablePath): (Timings, Solution) = @@ -14,7 +16,6 @@ object Day16 extends Solver(16): val end = grid.findFirst(_ == 'E').get case class State(distance: Int, pose: Pose) - implicit def ord: Ordering[State] = Ordering.by(-1 * _.distance) def search(start: Pose): (Map[Pose, Int], Map[Pose, List[Pose]]) = val distance = mutable.Map(start -> 0) @@ -32,18 +33,23 @@ object Day16 extends Solver(16): then far.push(State(vDist, v)) else near.push(State(vDist, v)) - while near.nonEmpty do + boundary: while near.nonEmpty do - val State(uDist, u) = near.pop() - if uDist == distance(u) then - if !grid(u.step.pos).contains('#') then - relax(u, u.step, uDist + 1, false) - for (v <- Seq(u.turnLeft, u.turnRight)) do - relax(u, v, uDist + 1000, true) + var atEnd = false; + while near.nonEmpty do + val State(uDist, u) = near.pop() + atEnd |= u.pos == end + if uDist == distance(u) then + if !grid(u.step.pos).contains('#') then + relax(u, u.step, uDist + 1, false) + for (v <- Seq(u.turnLeft, u.turnRight)) do + relax(u, v, uDist + 1000, true) - val tmp = near - near = far - far = tmp + if atEnd then break() + + val tmp = near + near = far + far = tmp (distance.toMap, ancestor.toMap) @@ -51,7 +57,7 @@ object Day16 extends Solver(16): search(Pose(start, Direction.Right)) } - val endPose = DIRS.map(Pose(end, _)).minBy(distance(_)) + val endPose = DIRS.map(Pose(end, _)).minBy(distance.getOrElse(_, 1_000_000)) val p1 = distance(endPose)