Solve day 6 of AoC 2024
This commit is contained in:
parent
74ab5de1ea
commit
ef37914813
4 changed files with 503 additions and 0 deletions
229
advent-of-code/2024/day_06/README.md
Normal file
229
advent-of-code/2024/day_06/README.md
Normal file
|
@ -0,0 +1,229 @@
|
|||
# Day 6: Guard Gallivant
|
||||
|
||||
The Historians use their fancy device again, this time to whisk you all away to the North Pole prototype suit manufacturing lab...
|
||||
in the year 1518! It turns out that having direct access to history is very convenient for a group of historians.
|
||||
|
||||
You still have to be careful of time paradoxes, and so it will be important to avoid anyone from 1518 while
|
||||
The Historians search for the Chief. Unfortunately, a single guard is patrolling this part of the lab.
|
||||
|
||||
Maybe you can work out where the guard will go ahead of time so that The Historians can search safely?
|
||||
|
||||
You start by making a map (your puzzle input) of the situation. For example:
|
||||
|
||||
```
|
||||
....#.....
|
||||
.........#
|
||||
..........
|
||||
..#.......
|
||||
.......#..
|
||||
..........
|
||||
.#..^.....
|
||||
........#.
|
||||
#.........
|
||||
......#...
|
||||
```
|
||||
|
||||
The map shows the current position of the guard with ^ (to indicate the guard is currently facing up from the perspective of the map).
|
||||
Any obstructions - crates, desks, alchemical reactors, etc. - are shown as #.
|
||||
|
||||
Lab guards in 1518 follow a very strict patrol protocol which involves repeatedly following these steps:
|
||||
|
||||
- If there is something directly in front of you, turn right 90 degrees.
|
||||
- Otherwise, take a step forward.
|
||||
|
||||
Following the above protocol, the guard moves up several times until she reaches an obstacle (in this case, a pile of failed suit prototypes):
|
||||
|
||||
```
|
||||
....#.....
|
||||
....^....#
|
||||
..........
|
||||
..#.......
|
||||
.......#..
|
||||
..........
|
||||
.#........
|
||||
........#.
|
||||
#.........
|
||||
......#...
|
||||
```
|
||||
|
||||
Because there is now an obstacle in front of the guard, she turns right before continuing straight in her new facing direction:
|
||||
|
||||
```
|
||||
....#.....
|
||||
........>#
|
||||
..........
|
||||
..#.......
|
||||
.......#..
|
||||
..........
|
||||
.#........
|
||||
........#.
|
||||
#.........
|
||||
......#...
|
||||
```
|
||||
|
||||
Reaching another obstacle (a spool of several very long polymers), she turns right again and continues downward:
|
||||
|
||||
```
|
||||
....#.....
|
||||
.........#
|
||||
..........
|
||||
..#.......
|
||||
.......#..
|
||||
..........
|
||||
.#......v.
|
||||
........#.
|
||||
#.........
|
||||
......#...
|
||||
```
|
||||
|
||||
This process continues for a while, but the guard eventually leaves the mapped area (after walking past a tank of universal solvent):
|
||||
|
||||
```
|
||||
....#.....
|
||||
.........#
|
||||
..........
|
||||
..#.......
|
||||
.......#..
|
||||
..........
|
||||
.#........
|
||||
........#.
|
||||
#.........
|
||||
......#v..
|
||||
```
|
||||
|
||||
By predicting the guard's route, you can determine which specific positions in the lab will be in the patrol path.
|
||||
Including the guard's starting position, the positions visited by the guard before leaving the area are marked with an X:
|
||||
|
||||
```
|
||||
....#.....
|
||||
....XXXXX#
|
||||
....X...X.
|
||||
..#.X...X.
|
||||
..XXXXX#X.
|
||||
..X.X.X.X.
|
||||
.#XXXXXXX.
|
||||
.XXXXXXX#.
|
||||
#XXXXXXX..
|
||||
......#X..
|
||||
```
|
||||
|
||||
In this example, the guard will visit 41 distinct positions on your map.
|
||||
|
||||
Predict the path of the guard. How many distinct positions will the guard visit before leaving the mapped area?
|
||||
|
||||
|
||||
## Part Two
|
||||
|
||||
While The Historians begin working around the guard's patrol route, you borrow their fancy device and step outside the lab.
|
||||
From the safety of a supply closet, you time travel through the last few months and record the nightly status of the lab's guard post
|
||||
on the walls of the closet.
|
||||
|
||||
Returning after what seems like only a few seconds to The Historians, they explain that the guard's patrol area is simply too large
|
||||
for them to safely search the lab without getting caught.
|
||||
|
||||
Fortunately, they are pretty sure that adding a single new obstruction won't cause a time paradox.
|
||||
They'd like to place the new obstruction in such a way that the guard will get stuck in a loop, making the rest of the lab safe to search.
|
||||
|
||||
To have the lowest chance of creating a time paradox, The Historians would like to know all of the possible positions for such an obstruction.
|
||||
The new obstruction can't be placed at the guard's starting position - the guard is there right now and would notice.
|
||||
|
||||
In the above example, there are only 6 different positions where a new obstruction would cause the guard to get stuck in a loop.
|
||||
The diagrams of these six situations use O to mark the new obstruction, | to show a position where the guard moves up/down, - to show
|
||||
a position where the guard moves left/right, and + to show a position where the guard moves both up/down and left/right.
|
||||
|
||||
Option one, put a printing press next to the guard's starting position:
|
||||
|
||||
```
|
||||
....#.....
|
||||
....+---+#
|
||||
....|...|.
|
||||
..#.|...|.
|
||||
....|..#|.
|
||||
....|...|.
|
||||
.#.O^---+.
|
||||
........#.
|
||||
#.........
|
||||
......#...
|
||||
```
|
||||
|
||||
Option two, put a stack of failed suit prototypes in the bottom right quadrant of the mapped area:
|
||||
|
||||
```
|
||||
....#.....
|
||||
....+---+#
|
||||
....|...|.
|
||||
..#.|...|.
|
||||
..+-+-+#|.
|
||||
..|.|.|.|.
|
||||
.#+-^-+-+.
|
||||
......O.#.
|
||||
#.........
|
||||
......#...
|
||||
```
|
||||
|
||||
Option three, put a crate of chimney-squeeze prototype fabric next to the standing desk in the bottom right quadrant:
|
||||
|
||||
```
|
||||
....#.....
|
||||
....+---+#
|
||||
....|...|.
|
||||
..#.|...|.
|
||||
..+-+-+#|.
|
||||
..|.|.|.|.
|
||||
.#+-^-+-+.
|
||||
.+----+O#.
|
||||
#+----+...
|
||||
......#...
|
||||
```
|
||||
|
||||
Option four, put an alchemical retroencabulator near the bottom left corner:
|
||||
|
||||
```
|
||||
....#.....
|
||||
....+---+#
|
||||
....|...|.
|
||||
..#.|...|.
|
||||
..+-+-+#|.
|
||||
..|.|.|.|.
|
||||
.#+-^-+-+.
|
||||
..|...|.#.
|
||||
#O+---+...
|
||||
......#...
|
||||
```
|
||||
|
||||
Option five, put the alchemical retroencabulator a bit to the right instead:
|
||||
|
||||
```
|
||||
....#.....
|
||||
....+---+#
|
||||
....|...|.
|
||||
..#.|...|.
|
||||
..+-+-+#|.
|
||||
..|.|.|.|.
|
||||
.#+-^-+-+.
|
||||
....|.|.#.
|
||||
#..O+-+...
|
||||
......#...
|
||||
```
|
||||
|
||||
Option six, put a tank of sovereign glue right next to the tank of universal solvent:
|
||||
|
||||
```
|
||||
....#.....
|
||||
....+---+#
|
||||
....|...|.
|
||||
..#.|...|.
|
||||
..+-+-+#|.
|
||||
..|.|.|.|.
|
||||
.#+-^-+-+.
|
||||
.+----++#.
|
||||
#+----++..
|
||||
......#O..
|
||||
```
|
||||
|
||||
It doesn't really matter what you choose to use as an obstacle so long as you and The Historians can put it into position without
|
||||
the guard noticing. The important thing is having enough options that you can find one that minimizes time paradoxes,
|
||||
and in this example, there are 6 different positions you could choose.
|
||||
|
||||
You need to get the guard stuck in a loop by adding a single new obstruction.
|
||||
How many different positions could you choose for this obstruction?
|
130
advent-of-code/2024/day_06/input.txt
Normal file
130
advent-of-code/2024/day_06/input.txt
Normal file
|
@ -0,0 +1,130 @@
|
|||
........#.............................................#.........#..............#.......#....................#....................#
|
||||
......................#........#........................#.............##............................#.#.............#..........#..
|
||||
....#..................................#..................#.........#....#..............#..#......................#........#...#..
|
||||
.....#...#...............#................#..........................#......#.....................#.......................#.......
|
||||
......................................................##.#....#..................................................................#
|
||||
#....#....................#..................................#.....................................#......................#.......
|
||||
.......#...........................#.......................#......#...#.................................................#...#.....
|
||||
....................##..........................#................#..........................#.#..................#....#.........#.
|
||||
#..................................#...............#...............#.........................#............##......................
|
||||
.............................#....................................#...............#.........#..........#.......................#..
|
||||
.................................#............###.......#............##......#...............................#...............#.#..
|
||||
.#..........................................#.......#.......................##..#........#........#...............#...............
|
||||
......#...#............#.#..............#...................#..........................................................##.........
|
||||
#................##....................................................................#........#.................#...#...........
|
||||
...#..........#..........................##......#....#..............................#......................................#.....
|
||||
..............................##.#..........................................................#..............................#......
|
||||
......#...........#....#..................#............#....................................................................#.....
|
||||
.....................#........................#.......................................................#...........................
|
||||
...................#.#..........................................................................................#.#...............
|
||||
.........................................##.........................................................#.......#...###......#........
|
||||
...............................................................##.......................#..........................#..............
|
||||
...#...........#.................#..............#......#.....#..........................#....................#....#...............
|
||||
.................................#................#................#..............................................#.......##.....#
|
||||
........#..........................#................#.......................#...................#.................................
|
||||
.............................#.............................#..........#.........................#........#........................
|
||||
....#................#.#................#...........................................................#...#....#......#......#......
|
||||
........#..............................#...............................#.................#........................................
|
||||
...........................................#..#........#...#...........#..#.............#.........................................
|
||||
.#.................#.#................................#................#.#..................................#........#............
|
||||
.......#..........................................#.................................................................#.............
|
||||
...................#....................................................#..#...............................................#......
|
||||
...#.#........#...#.....#.....................................................................................................#...
|
||||
......#.........................#......................#.............#.....................#......................................
|
||||
..........................#............#.................................#..#..........#........#......................#..........
|
||||
...#..#......#.......................#........................#...................................................................
|
||||
............#...........#................#..............#.........................................................................
|
||||
.#........#....#.........................................#........................................#...............................
|
||||
...#......................##.........#.......#.#...........#................................................#...#.................
|
||||
...........#......#.........#....#.....#.......................................................#.............#....................
|
||||
.............#...#..............................................#.........#.....##....................#...#.........#.............
|
||||
...............#................................#..........................................#.....#.#.........................#...#
|
||||
................#.....#..#.............#..............#..............#.......#....................................................
|
||||
......#.........................................................................................................#.........##......
|
||||
..#...........................#.#...........................................#..#.....#............................................
|
||||
...#...#..................#..................................#.........#...................#..................................#...
|
||||
............#..#.....................#.........................................#.......#..................................#.......
|
||||
...#.......................................................................#.............................#........................
|
||||
......#..................#....................................#......##...........................................................
|
||||
.#...............#.....#..........................................................................................#...............
|
||||
...#.............#.........................#.....................#...#..........#....#............................#...............
|
||||
...#............................#.......#...........#.........#........#.....#...........#...................................#....
|
||||
.....................#...................#................................#...............................#......#.........#..##..
|
||||
.............#........................................................................................#........................##.
|
||||
.....#.......#.......#............................................................................................................
|
||||
............................................#................................................................#..............#.....
|
||||
....#..#......................................................#...................................................#...............
|
||||
.................................#...##..................#.................................................#....#.................
|
||||
........#...................................#...#..........................................................#......................
|
||||
........................#........##...........#.......#........#...................................#..............................
|
||||
...........#...#...................................................#..............#......#...............#.#..................#...
|
||||
........#.............................................#...........................................................................
|
||||
........#................#......#..........#..#........#.#.......#...#........................#..#......................#.......#.
|
||||
.......#..........................................................................................................#.....#.....#...
|
||||
......................##....................#.....#.................#...........#.......................#.##..........#......#....
|
||||
....................................##....................................................................#.................#.....
|
||||
..#.................................#.#...........#............................................#....#.............................
|
||||
#...................................#...........................................#............#.........#...............#..........
|
||||
.......................#.............................................................#..........#...#.............#.....#.........
|
||||
#..................#.#.............................................................................#.................#............
|
||||
.....................#......#.......#...........#..........................................^...............................#......
|
||||
................................#......................#.#.....#..............#..................#....#.#......#....#.............
|
||||
............................................................................#........#.....................................#......
|
||||
.............#......................................................#...................................#......##..#....#.........
|
||||
...............#.................#...................#...............#............................................................
|
||||
..............#...........#..#...........................................#...................................#..........#.........
|
||||
..........#...........................#...................#..............#...#.......#..........#...................#.............
|
||||
.............#.#..................................#....#..#............#.....................#................#...#.....#.........
|
||||
...................#..........................................................#............##.....................................
|
||||
...........................................#............#........................................................................#
|
||||
..#..............................#....#...........................................................................................
|
||||
..#..#............#...........................#...#...........#............#.....#.................#..............................
|
||||
....#...................#.........#...............................................................................................
|
||||
.......#..........................#....................................##........#.................##...#.#........#..#...........
|
||||
.#........................#....#.......#.....#...................#.............................................#..................
|
||||
..#...............................................................#................................................#..............
|
||||
.....#........................................#...................................................................................
|
||||
..........................................#..........................................................#............................
|
||||
....................###.........................#............................#...#...........#............#.......................
|
||||
.....#.....#...............#........#.#....#...................#...........#........#...........#.................................
|
||||
................................................................................................#...##............................
|
||||
......................#............#.........................#.......................#.....#...........#...#.#....................
|
||||
............................#....................#..................#..............#..................................#...........
|
||||
...........................#...................................#..............................................................#...
|
||||
..................#................#.....................#...................#........#..............#............................
|
||||
............#.............#.....................#..................#.........#......................#............#............#...
|
||||
....#..........................#...............................................................................................#..
|
||||
................#.....................................#.............................#...........#........................#........
|
||||
#.##...........#.........................................#...............#..........................................#.#...........
|
||||
........................................#..............#.....................#............#.....#.................................
|
||||
.......#....##..#..#.....#........................................................................................................
|
||||
....##.............#..............................#...............................................................................
|
||||
.....#........................#.........#..#......#........#......................#.......#..............#..........#.......#.....
|
||||
..#....#.........................#.#....................#..#.......#.............#..................#........#..................#.
|
||||
..........##....#........................................................................#........................................
|
||||
........#......#................................................................................................#................#
|
||||
.....#.......#...#.............#....................................#..#........................#...#..............#....#.........
|
||||
.............#...................................................##...#...........................................................
|
||||
..............#.............................................#.............#................#.............#..............#.........
|
||||
..#....#..........#.....#......#......................#................................#...............................#..........
|
||||
.................................................................................##......#...........................#.....#......
|
||||
..#....#..........#.......#.........................................#...............#..#............................#........#....
|
||||
...........#........#.#....................#........#.....................................#..................#....................
|
||||
.......#............#................#...........#.............#......#.........#...........................#.....................
|
||||
#.#....#.#...............#....#.....#.......................#...............................#...................##...#............
|
||||
.................##...#.................................................................#...........................#.............
|
||||
.....#........................................#.........#...................................................#.....................
|
||||
....................#.....................#................................................#...##.....................#...........
|
||||
...............#...............................................................#....#.............................................
|
||||
.................#................#...#.....................................#......#....................#...............#.#.......
|
||||
...................#............................................#..#....#..#........#...............................#.........#...
|
||||
..#........#...............#..................#.....#..................#.....................................#........##...#......
|
||||
.....#.....#....#.....#................#.#.....................##.............................................................#...
|
||||
................#............#......#......#.......................................................#....................#........#
|
||||
........#..............#..#......................................................................##.....##........................
|
||||
.........#.............................#.........#.......................................#..........................#.##..........
|
||||
.#...................#........................................................#....#......................................#.......
|
||||
....#..........#.....#.........................................................................................#..................
|
||||
.......#.............................#............#.........................#....#....#........#......#.....#.......#.............
|
||||
..#.......#........................#........................#.....................................................................
|
||||
........................#...............................#.#.............#................................#..................#.....
|
136
advent-of-code/2024/day_06/lib.rb
Normal file
136
advent-of-code/2024/day_06/lib.rb
Normal file
|
@ -0,0 +1,136 @@
|
|||
def walk(matrix)
|
||||
should_continue = true
|
||||
|
||||
i, j = get_current_position(matrix)
|
||||
start_i, start_j = i, j
|
||||
start_symbol = matrix[i][j]
|
||||
|
||||
history = Hash.new
|
||||
|
||||
while should_continue do
|
||||
history["#{i},#{j}"] = true
|
||||
should_continue, i, j = make_step(matrix, i, j)
|
||||
end
|
||||
|
||||
matrix[start_i][start_j] = start_symbol
|
||||
return history.length
|
||||
end
|
||||
|
||||
def make_step(matrix, i, j)
|
||||
case matrix[i][j]
|
||||
when "^"
|
||||
if i == 0
|
||||
matrix[i][j] = "."
|
||||
return [false, -1, -1]
|
||||
end
|
||||
|
||||
if matrix[i-1][j] == "#"
|
||||
matrix[i][j] = ">"
|
||||
return [true, i, j]
|
||||
end
|
||||
|
||||
matrix[i-1][j] = "^"
|
||||
matrix[i][j] = "."
|
||||
return [true, i-1, j]
|
||||
when "v"
|
||||
if i == matrix.length-1
|
||||
matrix[i][j] = "."
|
||||
return [false, -1, -1]
|
||||
end
|
||||
|
||||
if matrix[i+1][j] == "#"
|
||||
matrix[i][j] = "<"
|
||||
return [true, i, j]
|
||||
end
|
||||
|
||||
matrix[i+1][j] = "v"
|
||||
matrix[i][j] = "."
|
||||
return [true, i+1, j]
|
||||
when ">"
|
||||
if j == matrix[i].length-1
|
||||
matrix[i][j] = "."
|
||||
return [false, -1, -1]
|
||||
end
|
||||
|
||||
if matrix[i][j+1] == "#"
|
||||
matrix[i][j] = "v"
|
||||
return [true, i, j]
|
||||
end
|
||||
|
||||
matrix[i][j+1] = ">"
|
||||
matrix[i][j] = "."
|
||||
return [true, i, j+1]
|
||||
when "<"
|
||||
if j == 0
|
||||
matrix[i][j] = "."
|
||||
return [false, -1, -1]
|
||||
end
|
||||
|
||||
if matrix[i][j-1] == "#"
|
||||
matrix[i][j] = "^"
|
||||
return [true, i, j]
|
||||
end
|
||||
|
||||
matrix[i][j-1] = "<"
|
||||
matrix[i][j] = "."
|
||||
return [true, i, j-1]
|
||||
end
|
||||
end
|
||||
|
||||
def get_current_position(matrix)
|
||||
for i in 0..matrix.length-1 do
|
||||
for j in 0..matrix[i].length-1 do
|
||||
if ['^', '>', 'v', '<'].include?(matrix[i][j])
|
||||
return [i, j]
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
return []
|
||||
end
|
||||
|
||||
def count_possible_obstructions(matrix)
|
||||
count = 0
|
||||
|
||||
start_i, start_j = get_current_position(matrix)
|
||||
start_symbol = matrix[start_i][start_j]
|
||||
|
||||
for i in 0..matrix.length-1 do
|
||||
for j in 0..matrix[i].length-1 do
|
||||
if matrix[i][j] != "."
|
||||
next
|
||||
end
|
||||
|
||||
matrix[i][j] = "#"
|
||||
if test_loop(matrix, start_i, start_j)
|
||||
count += 1
|
||||
end
|
||||
matrix[i][j] = "."
|
||||
matrix[start_i][start_j] = start_symbol
|
||||
end
|
||||
end
|
||||
|
||||
return count
|
||||
end
|
||||
|
||||
def test_loop(matrix, i, j)
|
||||
should_continue = true
|
||||
|
||||
history = Hash.new
|
||||
|
||||
while should_continue do
|
||||
symbol = matrix[i][j]
|
||||
key = "#{i},#{j},#{symbol}"
|
||||
|
||||
if history.include?(key)
|
||||
matrix[i][j] = "."
|
||||
return true
|
||||
end
|
||||
|
||||
history[key] = true
|
||||
|
||||
should_continue, i, j = make_step(matrix, i, j)
|
||||
end
|
||||
|
||||
return false
|
||||
end
|
8
advent-of-code/2024/day_06/main.rb
Normal file
8
advent-of-code/2024/day_06/main.rb
Normal file
|
@ -0,0 +1,8 @@
|
|||
require_relative 'lib'
|
||||
|
||||
matrix = File.readlines("input.txt", chomp: true)
|
||||
x = walk(matrix)
|
||||
puts(x)
|
||||
|
||||
x = count_possible_obstructions(matrix)
|
||||
puts(x)
|
Loading…
Reference in a new issue