diff --git a/aoc/src/dev/ctsk/aoc/Main.scala b/aoc/src/dev/ctsk/aoc/Main.scala index 3d471e3..0da9c12 100644 --- a/aoc/src/dev/ctsk/aoc/Main.scala +++ b/aoc/src/dev/ctsk/aoc/Main.scala @@ -7,7 +7,8 @@ val solvers = Map[Int, Solver]( 2 -> Day02, 3 -> Day03, 4 -> Day04, - 5 -> Day05 + 5 -> Day05, + 6 -> Day06 ) def runSolver(solver: Solver, input: os.Path): Unit = diff --git a/aoc/src/dev/ctsk/aoc/days/Day06.scala b/aoc/src/dev/ctsk/aoc/days/Day06.scala new file mode 100644 index 0000000..9589614 --- /dev/null +++ b/aoc/src/dev/ctsk/aoc/days/Day06.scala @@ -0,0 +1,64 @@ +package dev.ctsk.aoc.days + +import dev.ctsk.aoc._ +import scala.compiletime.ops.boolean +import scala.util.boundary.break +import scala.compiletime.ops.double + +object Day06 extends Solver(6): + + def patrol( + grid: Array[Array[Char]], + start: (Int, Int) + ): (Boolean, () => Vector[(Int, Int)]) = + var seen = + Array.fill(4)(Array.fill(grid.length)(Array.fill(grid(0).length)(false))) + + def visited() = + (for + row <- 0 until grid.length + col <- 0 until grid(0).length + if (0 until 4).exists(v => seen(v)(row)(col)) + yield (row, col)).toVector + + var dirs = Vector((-1, 0), (0, 1), (1, 0), (0, -1)) + var dir = 0 + var pos = start + seen(dir)(pos._1)(pos._2) = true + + while true do + val next = (pos._1 + dirs(dir)._1, pos._2 + dirs(dir)._2) + if next._1 < 0 || next._1 >= grid.length + || next._2 < 0 || next._2 >= grid(0).length + then return (false, visited) + else if grid(next._1)(next._2) == '#' + then dir = (dir + 1) % 4 + else if seen(dir)(next._1)(next._2) + then return (true, visited) + else + seen(dir)(next._1)(next._2) = true + pos = next + (false, visited) + + def run(input: os.ReadablePath): (Timings, Solution) = + val lines = os.read.lines(input).map(_.toArray).toArray + + var start = + (for + i <- 0 until lines.length + j <- 0 until lines(i).length + if lines(i)(j) == '^' + yield (i, j)).head + + val visited = patrol(lines, start) + val p1 = visited._2().size + var p2 = 0 + val (p2_time, _) = timed { + for (i, j) <- visited._2() + do + lines(i)(j) = '#' + if patrol(lines, start)._1 then p2 += 1 + lines(i)(j) = '.' + } + + return (Timings(0, 0, p2_time), Solution(Int.box(p1), Int.box(p2))) diff --git a/data/06.ans b/data/06.ans new file mode 100644 index 0000000..2743151 --- /dev/null +++ b/data/06.ans @@ -0,0 +1,2 @@ +5242 +1424 diff --git a/data/06.in b/data/06.in new file mode 100644 index 0000000..13453bc --- /dev/null +++ b/data/06.in @@ -0,0 +1,130 @@ +.........................#...........#.#...#...............#..............##.....................#...........#..#.........#....... +.....................#.................#.......#.........................#...........#.#.......#.................................. +.........#...........#........#.........#.........#...........#........................................#.........................# +.......#.........................#...........................#.............#...................................................... +..................#................##...............#.#.....................##............#....................................... +......#...#................#..................................................................#....#.#............................ +.......##................#........#..#.......#......................................#........#............#......###..........#... +.....................#....................................................#...........#..#...#..........................#......... +...........#....#...........................#.#...............#..#....................................#..............#......#..... +.....#........##...............#.......#..#..............................................#..........................#............. +.#.........#.#...........................#..........................#......................#...........#........#................. +.................................................................#..#.#.......#..#................................................ +...............................................#.......#...................#....................#................................. +.......#......#......#......................#...............................#.....##........#...........#......#.................. +........................................................................................................#.....#.#................. +..#...............................#.#..................................#.............#............................................ +..............#..........................................#.....#.....#..........................#....#.........#.................. +...................................#........................................#................#...........##.....#....#............ +.#.....................................#.......#........................#...................##............#....................... +.#..................#...........#...........................................................................................#..... +........................#...................................................##.................................#..#..........##... +........#............................#.......#...........................#.#...#...................................#.....#........ +...............................#............#.....#......................#.......#...#........................#................... +.........#.............#.................................................#.......................................#....#........... +...................................................................#...#.................................#...................#.... +...#.....................#...#...............#..................................................#...#...#......................... +...................#........#....#....#..#..#...................#.........#..................#..#....#.......#.#.................# +..............................#........................................#......#.....#..............##................#............ +............#..#.............#.......#........................................................##........#.....#................... +.....#.............................................................#...#.#.#.............................#..#.#...........#....... +.......#....#............................................#.................................#...................................#.. +..#.................#.......#..........................#........................................#...............#..............#.. +....#.#...................#............................#..#....................................................................... +.......................#...............#..............#......#......................#.....................#..............#........ +.#..........#.......................................................................#....................................#........ +.#.......#..................................................................#..................................................... +..................................................#.............#.............................................#................#.# +.......................#......#....#................#......................................................#.......#.........#.... +..........................#.#........................................................#......#................................#.... +....................................................................#...............................#............................. +..#...........#..............................#..#....#............................#...............##..............#...#...#...#..# +...................................#................................................................#....#...................#.... +..#....#........#..##....#........................#...#...................................#....................................... +...................#................................................................................................#............. +.......#........#................#...#.......................................................................#.................... +..............#....................#..........................##.........#.....................................#.................. +.........................................................................#.................#........................#............. +.............................#..........#.......................................................#......................#.......... +............###....................................................................#.......................#...................... +........#........#...........#.............................#....................#..........#.........................#.#.....#.... +.........................................................................................................#..#..................... +#.#.....#..........................................................#.....................#........................................ +........##..........#....................................................#..#........#.......#........#................#.......... +.............................................#..........................#.........#........................#...................... +...........................##.............#........................#.#........................#..#................#.....#........# +#...#..............................................#........#...................................................#................. +.............#................#............................#............#......................................................... +#..........................#............#.....................#.....#.................#......#...##...#.............#.#........... +.....................#...#..#....#...................................#....................#..............#........#............... +.......................#.................#...........#....#.......#...........................................#..#................ +.........#...........#.#.........#.........................#.....#................................................................ +....................#........#...................................................................#............#..#.#.#............ +..........#.......................#.......................#....................................................................... +......................................#......#............................#..............................................#........ +.....................#...#.................#.............................#....#................................................... +..............##...................................................................#......................................##...... +.....#....#...............................................#.......#.##........#.#.............#...............#................... +....................................#......................#........#.......................................................#..... +.....#.........................................#.....................#.............#.................#..................#......... +................................#.........#..#............................................#.........................#............. +....#.#.....................#......#...................................#..........................................#..#.....#...#.. +.........##.......................#..........................................#.........................#...##..................... +...............................................................#................................................................#. +............#.........................................##.......................................#.................................. +.............................#..............................#..................#.........#.....#.................................. +..........................................................#...#.....#..................#................................#......... +......#...................#.........................................................................................#............. +#...............................#...........................#..................................................................... +.......#........#.................................................#.......................................................#....... +.#......................................................#..............#..................................#...........#........... +.............#..#.#.......................#..........#......#.##.........................................................#..#..... +.......#...............#........#......................................................................#..#...........#........... +............#.........................................#................................................#...................#...... +............#...........................................#.#.......#....................................#.......................... +...........................................#.........................................................#..............#............. +..................#..#....................................................#..................#.................................... +..#........................#........#............................................................................................. +.............#........#......................#.......................................#...#....#............................#...... +............#.......#.............#...#...........#.#.................................#.................##........................ +.....................................................................................#.........#.......................#.....#.... +.................#................................#..#....#......#..........................................#.....#............... +..#...............................#........................................................#.......#...#............#............. +#.........#..#..#.....................................#....................................#................#.................#... +.......................#..#...#............................................................................#..#.....#.......##.... +..........#............#.......................#.........................^......#.#...................................#........... +...##........................##..........#..........#.................#...............#...........#.....##........................ +..............#............#..........................#....#...........#......#......#......................#..................... +......#.....#....................................................#............#.#......................................#.......... +......#.............................#......................#...............................#........#............................. +.#..........#.............................................#.............................................#......................... +...............................##................................................................................................. +.....................#................................................#...............#............#...............#.....#.....#.. +..................#...........................................................................#...........#...................#... +##..............................#.#...#.#...............................#...........#.#...................#....................... +......................#.........#...................................#.................#........................................... +.......................#............................................................................#.........##...........#...... +.....................................................................#.......#.....#.......................................#...... +#....................................#........#.#.................................................................##.....#........ +..............#..............................#......#..........###.........#................#..............#..................#... +..................................#..............................#.................##.............................#...#........... +...............#......#........................#....#........#............#.........#..........#..............#......#............ +...#...........#........#...#...........................#.............#.....................................#..................... +..............###............#...........................................................#.............#.........##..#............ +............#................................................#.......#..................#....#.................................... +.........#.#...#.....#...........................#.....##......#.....................#..#........#......#......................... +.#....#.......#.......................#.................................................................#.......#..............#.. +...................#................................................................#.............#...#...........#.........#..... +.......#.#.......#.......................#....#.....#...............#...#.....#...........................................#....... +.......#........#...........................................#...........#.........................#....#.......#.................. +..................................#.#.................#.#............................................#...........#....#........... +....##......#.............#...................................#...#.........#...........................#......#.................. +.........................#......#....#...#........................................................................................ +...#...............#............................................................................#...........................#..... +....##.#..............................................#............#................#................................#......#..... +.........#...........................................#...#.......##..............................#................................ +..................#..........#......#.......#......................................#........#...............#......#...........##. +........................................#......#..........#......................................................................# +..............#...#...................#.....#..........................................................#..............#......#.... +...#........#........................#...#................#........#.............................##..........................#.... +............#............................#.#........................#.................................#..........................#