Skip to content

Commit 29b580a

Browse files
committed
Solve 2024 day 6 part 2
1 parent 610532a commit 29b580a

File tree

2 files changed

+27
-1
lines changed

2 files changed

+27
-1
lines changed

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

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@ package eu.sim642.adventofcode2024
22

33
import eu.sim642.adventofcodelib.Grid
44
import eu.sim642.adventofcodelib.pos.Pos
5-
import eu.sim642.adventofcodelib.GridImplicits._
5+
import eu.sim642.adventofcodelib.GridImplicits.*
66
import eu.sim642.adventofcode2018.Day13.DirectionPos
7+
import eu.sim642.adventofcodelib.box.Box
8+
import eu.sim642.adventofcodelib.cycle.NaiveCycleFinder
79

810
object 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
}

src/test/scala/eu/sim642/adventofcode2024/Day6Test.scala

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,4 +24,12 @@ class Day6Test extends AnyFunSuite {
2424
test("Part 1 input answer") {
2525
assert(countGuardPoss(parseInput(input)) == 4752)
2626
}
27+
28+
test("Part 2 examples") {
29+
assert(countObstructionPoss(parseInput(exampleInput)) == 6)
30+
}
31+
32+
ignore("Part 2 input answer") {
33+
assert(countObstructionPoss(parseInput(input)) == 1719) // TODO: optimize
34+
}
2735
}

0 commit comments

Comments
 (0)