#' Day 25: Sea Cucumber
#'
#' [Sea Cucumber](https://adventofcode.com/2021/day/25)
#'
#' @name day25
#' @rdname day25
#' @details
#'
#' **Part One**
#'
#' This is it: the bottom of the ocean trench, the last place the sleigh
#' keys could be. Your submarine\'s experimental antenna *still isn\'t
#' boosted enough* to detect the keys, but they *must* be here. All you
#' need to do is *reach the seafloor* and find them.
#'
#' At least, you\'d touch down on the seafloor if you could; unfortunately,
#' it\'s completely covered by two large herds of [sea
#' cucumbers](https://en.wikipedia.org/wiki/Sea_cucumber), and there isn\'t
#' an open space large enough for your submarine.
#'
#' You suspect that the Elves must have done this before, because just then
#' you discover the phone number of a deep-sea marine biologist on a
#' handwritten note taped to the wall of the submarine\'s cockpit.
#'
#' \"Sea cucumbers? Yeah, they\'re probably hunting for food. But don\'t
#' worry, they\'re predictable critters: they move in perfectly straight
#' lines, only moving forward when there\'s space to do so. They\'re
#' actually quite polite!\"
#'
#' You explain that you\'d like to predict when you could land your
#' submarine.
#'
#' \"Oh that\'s easy, they\'ll eventually pile up and leave enough space
#' for\-- wait, did you say submarine? And the only place with that many
#' sea cucumbers would be at the very bottom of the Mariana\--\" You hang
#' up the phone.
#'
#' There are two herds of sea cucumbers sharing the same region; one always
#' moves *east* (`>`), while the other always moves *south* (`v`). Each
#' location can contain at most one sea cucumber; the remaining locations
#' are *empty* (`.`). The submarine helpfully generates a map of the
#' situation (your puzzle input). For example:
#'
#' v...>>.vv>
#' .vv>>.vv..
#' >>.>v>...v
#' >>v>>.>.v.
#' v>v.vv.v..
#' >.>>..v...
#' .vv..>.>v.
#' v.v..>>v.v
#' ....v..v.>
#'
#' Every *step*, the sea cucumbers in the east-facing herd attempt to move
#' forward one location, then the sea cucumbers in the south-facing herd
#' attempt to move forward one location. When a herd moves forward, every
#' sea cucumber in the herd first simultaneously considers whether there is
#' a sea cucumber in the adjacent location it\'s facing (even another sea
#' cucumber facing the same direction), and then every sea cucumber facing
#' an empty location simultaneously moves into that location.
#'
#' So, in a situation like this:
#'
#' ...>>>>>...
#'
#' After one step, only the rightmost sea cucumber would have moved:
#'
#' ...>>>>.>..
#'
#' After the next step, two sea cucumbers move:
#'
#' ...>>>.>.>.
#'
#' During a single step, the east-facing herd moves first, then the
#' south-facing herd moves. So, given this situation:
#'
#' ..........
#' .>v....v..
#' .......>..
#' ..........
#'
#' After a single step, of the sea cucumbers on the left, only the
#' south-facing sea cucumber has moved (as it wasn\'t out of the way in
#' time for the east-facing cucumber on the left to move), but both sea
#' cucumbers on the right have moved (as the east-facing sea cucumber moved
#' out of the way of the south-facing sea cucumber):
#'
#' ..........
#' .>........
#' ..v....v>.
#' ..........
#'
#' Due to *strong water currents* in the area, sea cucumbers that move off
#' the right edge of the map appear on the left edge, and sea cucumbers
#' that move off the bottom edge of the map appear on the top edge. Sea
#' cucumbers always check whether their destination location is empty
#' before moving, even if that destination is on the opposite side of the
#' map:
#'
#' Initial state:
#' ...>...
#' .......
#' ......>
#' v.....>
#' ......>
#' .......
#' ..vvv..
#'
#' After 1 step:
#' ..vv>..
#' .......
#' >......
#' v.....>
#' >......
#' .......
#' ....v..
#'
#' After 2 steps:
#' ....v>.
#' ..vv...
#' .>.....
#' ......>
#' v>.....
#' .......
#' .......
#'
#' After 3 steps:
#' ......>
#' ..v.v..
#' ..>v...
#' >......
#' ..>....
#' v......
#' .......
#'
#' After 4 steps:
#' >......
#' ..v....
#' ..>.v..
#' .>.v...
#' ...>...
#' .......
#' v......
#'
#' To find a safe place to land your submarine, the sea cucumbers need to
#' stop moving. Again consider the first example:
#'
#' Initial state:
#' v...>>.vv>
#' .vv>>.vv..
#' >>.>v>...v
#' >>v>>.>.v.
#' v>v.vv.v..
#' >.>>..v...
#' .vv..>.>v.
#' v.v..>>v.v
#' ....v..v.>
#'
#' After 1 step:
#' ....>.>v.>
#' v.v>.>v.v.
#' >v>>..>v..
#' >>v>v>.>.v
#' .>v.v...v.
#' v>>.>vvv..
#' ..v...>>..
#' vv...>>vv.
#' >.v.v..v.v
#'
#' After 2 steps:
#' >.v.v>>..v
#' v.v.>>vv..
#' >v>.>.>.v.
#' >>v>v.>v>.
#' .>..v....v
#' .>v>>.v.v.
#' v....v>v>.
#' .vv..>>v..
#' v>.....vv.
#'
#' After 3 steps:
#' v>v.v>.>v.
#' v...>>.v.v
#' >vv>.>v>..
#' >>v>v.>.v>
#' ..>....v..
#' .>.>v>v..v
#' ..v..v>vv>
#' v.v..>>v..
#' .v>....v..
#'
#' After 4 steps:
#' v>..v.>>..
#' v.v.>.>.v.
#' >vv.>>.v>v
#' >>.>..v>.>
#' ..v>v...v.
#' ..>>.>vv..
#' >.v.vv>v.v
#' .....>>vv.
#' vvv>...v..
#'
#' After 5 steps:
#' vv>...>v>.
#' v.v.v>.>v.
#' >.v.>.>.>v
#' >v>.>..v>>
#' ..v>v.v...
#' ..>.>>vvv.
#' .>...v>v..
#' ..v.v>>v.v
#' v.v.>...v.
#'
#' ...
#'
#' After 10 steps:
#' ..>..>>vv.
#' v.....>>.v
#' ..v.v>>>v>
#' v>.>v.>>>.
#' ..v>v.vv.v
#' .v.>>>.v..
#' v.v..>v>..
#' ..v...>v.>
#' .vv..v>vv.
#'
#' ...
#'
#' After 20 steps:
#' v>.....>>.
#' >vv>.....v
#' .>v>v.vv>>
#' v>>>v.>v.>
#' ....vv>v..
#' .v.>>>vvv.
#' ..v..>>vv.
#' v.v...>>.v
#' ..v.....v>
#'
#' ...
#'
#' After 30 steps:
#' .vv.v..>>>
#' v>...v...>
#' >.v>.>vv.>
#' >v>.>.>v.>
#' .>..v.vv..
#' ..v>..>>v.
#' ....v>..>v
#' v.v...>vv>
#' v.v...>vvv
#'
#' ...
#'
#' After 40 steps:
#' >>v>v..v..
#' ..>>v..vv.
#' ..>>>v.>.v
#' ..>>>>vvv>
#' v.....>...
#' v.v...>v>>
#' >vv.....v>
#' .>v...v.>v
#' vvv.v..v.>
#'
#' ...
#'
#' After 50 steps:
#' ..>>v>vv.v
#' ..v.>>vv..
#' v.>>v>>v..
#' ..>>>>>vv.
#' vvv....>vv
#' ..v....>>>
#' v>.......>
#' .vv>....v>
#' .>v.vv.v..
#'
#' ...
#'
#' After 55 steps:
#' ..>>v>vv..
#' ..v.>>vv..
#' ..>>v>>vv.
#' ..>>>>>vv.
#' v......>vv
#' v>v....>>v
#' vvv...>..>
#' >vv.....>.
#' .>v.vv.v..
#'
#' After 56 steps:
#' ..>>v>vv..
#' ..v.>>vv..
#' ..>>v>>vv.
#' ..>>>>>vv.
#' v......>vv
#' v>v....>>v
#' vvv....>.>
#' >vv......>
#' .>v.vv.v..
#'
#' After 57 steps:
#' ..>>v>vv..
#' ..v.>>vv..
#' ..>>v>>vv.
#' ..>>>>>vv.
#' v......>vv
#' v>v....>>v
#' vvv.....>>
#' >vv......>
#' .>v.vv.v..
#'
#' After 58 steps:
#' ..>>v>vv..
#' ..v.>>vv..
#' ..>>v>>vv.
#' ..>>>>>vv.
#' v......>vv
#' v>v....>>v
#' vvv.....>>
#' >vv......>
#' .>v.vv.v..
#'
#' In this example, the sea cucumbers stop moving after `58` steps.
#'
#' Find somewhere safe to land your submarine. *What is the first step on
#' which no sea cucumbers move?*
#'
#' **Part Two**
#'
#' *(Use have to manually add this yourself.)*
#'
#' *(Try using `convert_clipboard_html_to_roxygen_md()`)*
#'
#' @param x some data
#' @return For Part One, `f25a(x)` returns .... For Part Two,
#' `f25b(x)` returns ....
#' @export
#' @examples
#' f25a(example_data_25())
f25a <- function(x) {
nr <- nrow(x)
nc <- ncol(x)
i <- 1
repeat {
y <- x
move_east <- x == ">" & x[, c(2:nc, 1)] == "."
x[move_east] <- "."
x[, c(2:nc, 1)][move_east] <- ">"
move_south <- x == "v" & x[c(2:nr, 1), ] == "."
x[move_south] <- "."
x[c(2:nr, 1),][move_south] <- "v"
if (isTRUE(all.equal(x, y))) break
i <- i + 1
}
i
}
#' @param example Which example data to use (by position or name). Defaults to
#' 1.
#' @rdname day25
#' @export
example_data_25 <- function(example = 1) {
l <- list(
a = matrix(c("v", ".", ">", ">", "v", ">", ".", "v", ".", ".",
"v", ">", ">", ">", ".", "v", ".", ".", ".", "v",
".", "v", "v", ">", "v", "v", ".", ".", ">", ">",
">", ".", ">", ".", ".", ".", ">", ">", "v", ">",
"v", ".", ".", ".", "v", ">", ".", ">", ".", "v",
".", ">", ">", ".", ".", "v", ".", ">", ".", "v",
".", ">", ".", "v", "v", ".", ".", "v", ".", ">",
"v", "v", "v", ".", ".", "v", ".", ".", "v", ".",
".", ">", ".", "v", ".", ".", ".", ".", "v", ">"),
nrow = 9, ncol = 10)
)
l[[example]]
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.