Aloha, it turns out that a dumbo octupus can flash. This helps us navigating through the dark. More on https://adventofcode.com/2021/day/11.
Data
raw_data <- readLines(con = "day_eleven")
integer_split <- lapply(raw_data, function(x){
as.integer(strsplit(x, split = "")[[1]])
})
m <- do.call(rbind, integer_split)
#preparing part 2
all_flashed <- ncol(m) * nrow(m)
m_t <- cbind(NA, rbind(NA, m, NA), NA)
Functions
MNeighbors <- function(mat, i = 2L, j = 3L, range_vec = -1 : 1) {
mat[i + range_vec, j + range_vec] <- mat[i + range_vec, j + range_vec] + 1L
mat[c(1, nrow(mat)),] <- NA
mat[,c(1, ncol(mat))] <- NA
return(mat)
}
Part 1:
steps <- 100L
sum_flashes <- integer(length = steps)
for(k in seq(steps)) {
m_t <- m_t + 1L
flashes_mat <- which(m_t > 9L, arr.ind = TRUE)
flashed <- flashes_mat
while(any(flashes_mat)) {
for(i in 1 : nrow(flashes_mat)) {
m_t <- MNeighbors(m_t, i = flashes_mat[i, "row"], j = flashes_mat[i, "col"])
}
flashed <- rbind(flashed, flashes_mat)
#update flashes_mat
flashes_mat <- which(m_t > 9L, arr.ind = TRUE)
flashes_mat <- flashes_mat[!(paste0(flashes_mat[,1],
flashes_mat[,2])) %in% (paste0(flashed[, 1], flashed[, 2])),,
drop = FALSE]
}
sum_flashes[k] <- sum(m_t > 9L, na.rm = TRUE)
m_t[m_t > 9L] <- 0L
}
sum(sum_flashes)
## [1] 1640
Part 2
m_t <- cbind(NA, rbind(NA, m, NA), NA)
sum_flashes <- 0L
k <- 0L
while(sum_flashes < all_flashed) {
m_t <- m_t + 1L
flashes_mat <- which(m_t > 9L, arr.ind = TRUE)
flashed <- flashes_mat
while(any(flashes_mat)) {
for(i in 1 : nrow(flashes_mat)) {
m_t <- MNeighbors(m_t, i = flashes_mat[i, "row"], j = flashes_mat[i, "col"])
}
flashed <- rbind(flashed, flashes_mat)
#update flashes mat
flashes_mat <- which(m_t > 9L, arr.ind = TRUE)
flashes_mat <- flashes_mat[!(paste0(flashes_mat[,1],
flashes_mat[,2])) %in% (paste0(flashed[, 1], flashed[, 2])),,
drop = FALSE]
}
sum_flashes <- sum(m_t > 9L, na.rm = TRUE)
m_t[m_t > 9L] <- 0L
k <- k + 1L
}
k
## [1] 312