@@ -2,8 +2,10 @@ package eu.sim642.adventofcode2024
22
33import eu .sim642 .adventofcodelib .Grid
44import eu .sim642 .adventofcodelib .pos .Pos
5- import eu .sim642 .adventofcodelib .GridImplicits ._
5+ import eu .sim642 .adventofcodelib .GridImplicits .*
66import eu .sim642 .adventofcode2018 .Day13 .DirectionPos
7+ import eu .sim642 .adventofcodelib .box .Box
8+ import eu .sim642 .adventofcodelib .cycle .NaiveCycleFinder
79
810object Day6 {
911
@@ -30,6 +32,21 @@ object Day6 {
3032 .size
3133 }
3234
35+ def isGuardCycle (input : Input ): Boolean = {
36+ val it = iterateGuard(input).takeWhile(guard => input.grid.containsPos(guard.pos))
37+ val cycle = NaiveCycleFinder .find(it)
38+ cycle.isDefined
39+ }
40+
41+ def countObstructionPoss (input : Input ): Int = { // TODO: optimize
42+ val Input (grid, guard) = input
43+ Box (Pos .zero, Pos (grid(8 ).size - 1 , grid.size - 1 ))
44+ .iterator
45+ .filter(obstructionPos => obstructionPos != guard.pos && ! grid(obstructionPos))
46+ .map(obstructionPos => Input (grid.updatedGrid(obstructionPos, true ), guard))
47+ .count(isGuardCycle)
48+ }
49+
3350 def parseGrid (input : String ): Grid [Boolean ] = input.linesIterator.map(_.toVector).toVector.mapGrid({
3451 case '#' => true
3552 case '.' => false
@@ -49,5 +66,6 @@ object Day6 {
4966
5067 def main (args : Array [String ]): Unit = {
5168 println(countGuardPoss(parseInput(input)))
69+ println(countObstructionPoss(parseInput(input)))
5270 }
5371}
0 commit comments