2025

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.

— R Day 3 Part 1 —

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)
}
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

— R Day 3 Part 2 —

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)
}
Run
aoc_source(day = 3, part = 2)

input = aoc_read(day = 3)

aoc_run(solve_day3_part2(input))
Elapsed: 0.011 seconds
Memory:  725 KB

— Python Day 3 Part 1 —

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)
Run
aoc_source(day = 3, part = 1)

input = aoc_read(day = 3)

result = aoc_run("solve_day3_part1(input)")
Elapsed: 0.002 seconds
Memory:  181 KB

— Python Day 3 Part 2 —

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)
Run
aoc_source(day = 3, part = 2)

input = aoc_read(day = 3)

result = aoc_run("solve_day3_part2(input)")
Elapsed: 0.005 seconds
Memory:  187 KB
Back to top