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