Advent of Code 2021 - Day 11

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
Avatar
Moritz Mueller-Navarra

A Data Scientist using R

Related