Run
aoc_source(day = 3, part = 1)
input = aoc_read(day = 3)
aoc_run(solve_day3_part1(input))Elapsed: 0.007 seconds
Memory: 591 KB
I came up with a sliding window approach for today which I’m pretty happy with. Part 2 solution was generalised so that it could answer part 1 as well, with 2 supplied instead of 12.
solve_day3_part1 <- function(input) {
input |>
strsplit("") |>
lapply(as.integer) |>
vapply(max_jolt, integer(1)) |>
sum()
}
max_jolt <- function(bank) {
first_loc <- which.max(bank[1:(length(bank) - 1)])
first_digit <- bank[[first_loc]]
second_digit <- max(bank[(first_loc + 1):length(bank)])
joltage <- paste0(first_digit, second_digit)
as.integer(joltage)
}aoc_source(day = 3, part = 1)
input = aoc_read(day = 3)
aoc_run(solve_day3_part1(input))Elapsed: 0.007 seconds
Memory: 591 KB
solve_day3_part2 <- function(input) {
input |>
strsplit("") |>
lapply(as.integer) |>
vapply(max_jolt, numeric(1)) |>
sum()
}
#' @params bank Character vector of digits
#' @params digit_count Numeric number of digits to use for joltage
max_jolt <- function(bank, digit_count = 12) {
digit_nums <- seq_len(digit_count)
digits <- character(digit_count)
prev_loc <- 0L
len <- length(bank)
for (i in digit_nums) {
max_loc <- len - (digit_count - i)
valid_bank <- bank[(prev_loc + 1L):max_loc]
loc <- which.max(valid_bank)
prev_loc <- prev_loc + loc
digits[i] <- valid_bank[loc]
}
joltage <- paste0(digits, collapse = "")
as.numeric(joltage)
}aoc_source(day = 3, part = 2)
input = aoc_read(day = 3)
aoc_run(solve_day3_part2(input))Elapsed: 0.011 seconds
Memory: 725 KB
def solve_day3_part1(text):
banks = [list(line.strip("\n")) for line in text]
joltage = [max_jolt(bank) for bank in banks]
return(sum(joltage))
def max_jolt(bank, n = 2):
digits = [None] * n
prev_loc = -1
bank_len = len(bank)
for i in range(n):
max_loc = bank_len - (n - i) + 1
search_bank = bank[(prev_loc + 1):max_loc]
digits[i] = max(search_bank)
loc = search_bank.index(digits[i])
prev_loc = prev_loc + loc + 1
result = int(''.join(digits))
return(result)def solve_day3_part2(text):
banks = [list(line.strip("\n")) for line in text]
joltage = [max_jolt(bank) for bank in banks]
return(sum(joltage))
def max_jolt(bank, n = 12):
digits = [None] * n
prev_loc = -1
bank_len = len(bank)
for i in range(n):
max_loc = bank_len - (n - i) + 1
search_bank = bank[(prev_loc + 1):max_loc]
digits[i] = max(search_bank)
loc = search_bank.index(digits[i])
prev_loc = prev_loc + loc + 1
result = int(''.join(digits))
return(result)