2023

— R Day 9 Part 1 —

solve_day9_part1 <- function(input) {
  seqs <- stringi::stri_extract_all(input, regex = "\\-*\\d+")
  seqs <- lapply(seqs, as.numeric)

  values <- lapply(seqs, extrapolate_value)

  sum(unlist(values))
}

extrapolate_value <- function(sequence) {
  diffs <- vector("list", length(sequence))
  diffs[[1]] <- diff(sequence)

  i <- 1
  while (any(diffs[[i]] != 0)) {
    next_i <- i + 1
    diffs[[next_i]] <- diff(diffs[[i]])
    i <- next_i
  }

  diffs <- diffs[!vapply(diffs, is.null, logical(1))]

  last_diff <- rev(lapply(diffs, \(x) x[length(x)]))
  new_diff <- rep(0, length(last_diff))

  for (i in seq_along(last_diff[-length(last_diff)])) {
    new_diff[[i + 1]] <- last_diff[[i + 1]] + new_diff[[i]]
  }

  sequence[[length(sequence)]] + new_diff[[length(new_diff)]]
}
Run
aoc_source(day = 9, part = 1)

input = aoc_read(day = 9)

aoc_run(solve_day9_part1(input))
Elapsed: 0.022 seconds
Memory:  1034 KB

— R Day 9 Part 2 —

solve_day9_part2 <- function(input) {
  seqs <- stringi::stri_extract_all(input, regex = "\\-*\\d+")
  seqs <- lapply(seqs, as.numeric)

  values <- lapply(seqs, extrapolate_value)

  sum(unlist(values))
}

extrapolate_value <- function(sequence) {
  diffs <- vector("list", length(sequence))
  diffs[[1]] <- diff(sequence)

  i <- 1
  while (any(diffs[[i]] != 0)) {
    next_i <- i + 1
    diffs[[next_i]] <- diff(diffs[[i]])
    i <- next_i
  }

  diffs <- diffs[!vapply(diffs, is.null, logical(1))]

  first_diffs <- rev(lapply(diffs, \(x) x[1]))
  new_diffs <- rep(0, length(first_diffs))

  for (i in seq_along(first_diffs[-length(first_diffs)])) {
    new_diffs[[i + 1]] <- first_diffs[[i + 1]] - new_diffs[[i]]
  }

  sequence[[1]] - new_diffs[[length(new_diffs)]]
}
Run
aoc_source(day = 9, part = 2)

input = aoc_read(day = 9)

aoc_run(solve_day9_part2(input))
Elapsed: 0.02 seconds
Memory:  556 KB
Back to top