octopus <- octopusM |>
strsplit("") %>%
do.call(rbind, .) |>
as.matrix() |>
apply(1, as.numeric) |>
t()
octopusCol <- ncol(octopus)
octopusRow <- nrow(octopus)
flash_counter <- 0
get_adjacent <- function(xx, yy, ncol, nrow) {
x <- xx; y <- yy
x <- (x-1):(x+1); y <- (y-1):(y+1)
x <- x[sapply(x, \(j) between(j, 1, ncol))]
y <- y[sapply(y, \(j) between(j, 1, nrow))]
expand.grid("col" = x, "row" = y) |>
filter(!(col == xx & row == yy)) |>
as.matrix()
}
for(i in 1:100) {
octopus <- octopus + 1
while(any(octopus > 9)) {
flash <- which(octopus > 9, arr.ind = TRUE)
octopus[octopus > 9] <- 0
for(x in 1:nrow(flash)) {
adj <-
get_adjacent(flash[x, "col"], flash[x, "row"], octopusCol, octopusRow)
octopus[adj[,"row"], adj[,"col"]] <-
apply(octopus[adj[,"row"], adj[,"col"]], c(1, 2),
\(x) { ifelse(x == 0, 0, x + 1) })
}
}
flash_counter <<- flash_counter + length(octopus[octopus == 0])
}
flash_counter