advent_of_code_2025

My (attempted) solutions to the 2025 Advent of Code
git clone https://git.eamoncaddigan.net/advent_of_code_2025.git
Log | Files | Refs | README

day03.R (1593B)


      1 #!/usr/bin/env Rscript
      2 
      3 source("src/utils.R")
      4 
      5 test_input <- c(
      6   "987654321111111",
      7   "811111111111119",
      8   "234234234234278",
      9   "818181911112111"
     10 )
     11 puzzle_input <- aoc_input(3)
     12 
     13 parse_input <- function(input_lines) {
     14   input_lines |>
     15     strsplit("", fixed = TRUE) |>
     16     lapply(as.numeric)
     17 }
     18 
     19 choose_batteries <- function(battery_bank, num_batteries) {
     20   choose_batteries_iter <- function(batteries, bank_rema, num_batt_rema) {
     21     if (num_batt_rema == 0) {
     22       batteries
     23     } else {
     24       battery_loc <- which.max(
     25         bank_rema[1:(length(bank_rema) - num_batt_rema + 1)]
     26       )
     27       choose_batteries_iter(
     28         c(batteries, bank_rema[battery_loc]),
     29         bank_rema[(battery_loc + 1):length(bank_rema)],
     30         num_batt_rema - 1
     31       )
     32     }
     33   }
     34   choose_batteries_iter(NULL, battery_bank, num_batteries)
     35 }
     36 
     37 use_batteries <- function(batteries) {
     38   batteries |>
     39     paste(collapse = "") |>
     40     as.numeric()
     41 }
     42 
     43 solve_puzzle_for_n <- function(input_lines, n) {
     44   input_lines |>
     45     parse_input() |>
     46     lapply(\(x) choose_batteries(x, n)) |>
     47     vapply(use_batteries, numeric(1)) |>
     48     sum()
     49 }
     50 
     51 part1 <- function(input_lines) {
     52   solve_puzzle_for_n(input_lines, 2)
     53 }
     54 
     55 test_part1 <- function() {
     56   stopifnot(part1(test_input) == 357)
     57 }
     58 
     59 part2 <- function(input_lines) {
     60   solve_puzzle_for_n(input_lines, 12)
     61 }
     62 
     63 test_part2 <- function() {
     64   stopifnot(part2(test_input) == 3121910778619)
     65 }
     66 
     67 main <- function() {
     68   test_part1()
     69   cat("Part 1 solution: ", part1(puzzle_input), "\n")
     70   test_part2()
     71   cat("Part 2 solution: ", sprintf("%0.0f", part2(puzzle_input)), "\n")
     72 }
     73 
     74 main()