diff --git a/advent-of-code/2024/day_06/README.md b/advent-of-code/2024/day_06/README.md new file mode 100644 index 0000000..ecf0813 --- /dev/null +++ b/advent-of-code/2024/day_06/README.md @@ -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? diff --git a/advent-of-code/2024/day_06/input.txt b/advent-of-code/2024/day_06/input.txt new file mode 100644 index 0000000..40d9596 --- /dev/null +++ b/advent-of-code/2024/day_06/input.txt @@ -0,0 +1,130 @@ +........#.............................................#.........#..............#.......#....................#....................# +......................#........#........................#.............##............................#.#.............#..........#.. +....#..................................#..................#.........#....#..............#..#......................#........#...#.. +.....#...#...............#................#..........................#......#.....................#.......................#....... +......................................................##.#....#..................................................................# +#....#....................#..................................#.....................................#......................#....... +.......#...........................#.......................#......#...#.................................................#...#..... +....................##..........................#................#..........................#.#..................#....#.........#. +#..................................#...............#...............#.........................#............##...................... +.............................#....................................#...............#.........#..........#.......................#.. +.................................#............###.......#............##......#...............................#...............#.#.. +.#..........................................#.......#.......................##..#........#........#...............#............... +......#...#............#.#..............#...................#..........................................................##......... +#................##....................................................................#........#.................#...#........... +...#..........#..........................##......#....#..............................#......................................#..... +..............................##.#..........................................................#..............................#...... +......#...........#....#..................#............#....................................................................#..... +.....................#........................#.......................................................#........................... +...................#.#..........................................................................................#.#............... +.........................................##.........................................................#.......#...###......#........ +...............................................................##.......................#..........................#.............. +...#...........#.................#..............#......#.....#..........................#....................#....#............... +.................................#................#................#..............................................#.......##.....# +........#..........................#................#.......................#...................#................................. +.............................#.............................#..........#.........................#........#........................ +....#................#.#................#...........................................................#...#....#......#......#...... +........#..............................#...............................#.................#........................................ +...........................................#..#........#...#...........#..#.............#......................................... +.#.................#.#................................#................#.#..................................#........#............ +.......#..........................................#.................................................................#............. +...................#....................................................#..#...............................................#...... +...#.#........#...#.....#.....................................................................................................#... +......#.........................#......................#.............#.....................#...................................... +..........................#............#.................................#..#..........#........#......................#.......... +...#..#......#.......................#........................#................................................................... +............#...........#................#..............#......................................................................... +.#........#....#.........................................#........................................#............................... +...#......................##.........#.......#.#...........#................................................#...#................. +...........#......#.........#....#.....#.......................................................#.............#.................... +.............#...#..............................................#.........#.....##....................#...#.........#............. +...............#................................#..........................................#.....#.#.........................#...# +................#.....#..#.............#..............#..............#.......#.................................................... +......#.........................................................................................................#.........##...... +..#...........................#.#...........................................#..#.....#............................................ +...#...#..................#..................................#.........#...................#..................................#... +............#..#.....................#.........................................#.......#..................................#....... +...#.......................................................................#.............................#........................ +......#..................#....................................#......##........................................................... +.#...............#.....#..........................................................................................#............... +...#.............#.........................#.....................#...#..........#....#............................#............... +...#............................#.......#...........#.........#........#.....#...........#...................................#.... +.....................#...................#................................#...............................#......#.........#..##.. +.............#........................................................................................#........................##. +.....#.......#.......#............................................................................................................ +............................................#................................................................#..............#..... +....#..#......................................................#...................................................#............... +.................................#...##..................#.................................................#....#................. +........#...................................#...#..........................................................#...................... +........................#........##...........#.......#........#...................................#.............................. +...........#...#...................................................#..............#......#...............#.#..................#... +........#.............................................#........................................................................... +........#................#......#..........#..#........#.#.......#...#........................#..#......................#.......#. +.......#..........................................................................................................#.....#.....#... +......................##....................#.....#.................#...........#.......................#.##..........#......#.... +....................................##....................................................................#.................#..... +..#.................................#.#...........#............................................#....#............................. +#...................................#...........................................#............#.........#...............#.......... +.......................#.............................................................#..........#...#.............#.....#......... +#..................#.#.............................................................................#.................#............ +.....................#......#.......#...........#..........................................^...............................#...... +................................#......................#.#.....#..............#..................#....#.#......#....#............. +............................................................................#........#.....................................#...... +.............#......................................................#...................................#......##..#....#......... +...............#.................#...................#...............#............................................................ +..............#...........#..#...........................................#...................................#..........#......... +..........#...........................#...................#..............#...#.......#..........#...................#............. +.............#.#..................................#....#..#............#.....................#................#...#.....#......... +...................#..........................................................#............##..................................... +...........................................#............#........................................................................# +..#..............................#....#........................................................................................... +..#..#............#...........................#...#...........#............#.....#.................#.............................. +....#...................#.........#............................................................................................... +.......#..........................#....................................##........#.................##...#.#........#..#........... +.#........................#....#.......#.....#...................#.............................................#.................. +..#...............................................................#................................................#.............. +.....#........................................#................................................................................... +..........................................#..........................................................#............................ +....................###.........................#............................#...#...........#............#....................... +.....#.....#...............#........#.#....#...................#...........#........#...........#................................. +................................................................................................#...##............................ +......................#............#.........................#.......................#.....#...........#...#.#.................... +............................#....................#..................#..............#..................................#........... +...........................#...................................#..............................................................#... +..................#................#.....................#...................#........#..............#............................ +............#.............#.....................#..................#.........#......................#............#............#... +....#..........................#...............................................................................................#.. +................#.....................................#.............................#...........#........................#........ +#.##...........#.........................................#...............#..........................................#.#........... +........................................#..............#.....................#............#.....#................................. +.......#....##..#..#.....#........................................................................................................ +....##.............#..............................#............................................................................... +.....#........................#.........#..#......#........#......................#.......#..............#..........#.......#..... +..#....#.........................#.#....................#..#.......#.............#..................#........#..................#. +..........##....#........................................................................#........................................ +........#......#................................................................................................#................# +.....#.......#...#.............#....................................#..#........................#...#..............#....#......... +.............#...................................................##...#........................................................... +..............#.............................................#.............#................#.............#..............#......... +..#....#..........#.....#......#......................#................................#...............................#.......... +.................................................................................##......#...........................#.....#...... +..#....#..........#.......#.........................................#...............#..#............................#........#.... +...........#........#.#....................#........#.....................................#..................#.................... +.......#............#................#...........#.............#......#.........#...........................#..................... +#.#....#.#...............#....#.....#.......................#...............................#...................##...#............ +.................##...#.................................................................#...........................#............. +.....#........................................#.........#...................................................#..................... +....................#.....................#................................................#...##.....................#........... +...............#...............................................................#....#............................................. +.................#................#...#.....................................#......#....................#...............#.#....... +...................#............................................#..#....#..#........#...............................#.........#... +..#........#...............#..................#.....#..................#.....................................#........##...#...... +.....#.....#....#.....#................#.#.....................##.............................................................#... +................#............#......#......#.......................................................#....................#........# +........#..............#..#......................................................................##.....##........................ +.........#.............................#.........#.......................................#..........................#.##.......... +.#...................#........................................................#....#......................................#....... +....#..........#.....#.........................................................................................#.................. +.......#.............................#............#.........................#....#....#........#......#.....#.......#............. +..#.......#........................#........................#..................................................................... +........................#...............................#.#.............#................................#..................#..... diff --git a/advent-of-code/2024/day_06/lib.rb b/advent-of-code/2024/day_06/lib.rb new file mode 100644 index 0000000..2ba00b1 --- /dev/null +++ b/advent-of-code/2024/day_06/lib.rb @@ -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 diff --git a/advent-of-code/2024/day_06/main.rb b/advent-of-code/2024/day_06/main.rb new file mode 100644 index 0000000..611585a --- /dev/null +++ b/advent-of-code/2024/day_06/main.rb @@ -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)