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

commit afeb5d8953656863993c134c0f244f02adab4a20
parent 180e6d60336ea92ff5c3c0b9835723e1125ee511
Author: Eamon Caddigan <ec@eamoncaddigan.net>
Date:   Tue,  2 Dec 2025 14:35:47 -0800

Solve day 02, part 1

Diffstat:
Asrc/day02.R | 79+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 79 insertions(+), 0 deletions(-)

diff --git a/src/day02.R b/src/day02.R @@ -0,0 +1,79 @@ +source("src/utils.R") + +test_input <- "11-22,95-115,998-1012,1188511880-1188511890,222220-222224,1698522-1698528,446443-446449,38593856-38593862,565653-565659,824824821-824824827,2121212118-2121212124" +puzzle_input <- aoc_input(2) + +parse_input <- function(input_string) { + lapply(strsplit(strsplit(input_string, ",")[[1]], "-"), as.numeric) +} + +has_even_length <- function(num_string) { + nchar(num_string) %% 2 == 0 +} + +stem_to_id <- function(stem) { + as.numeric(sprintf("%d%d", stem, stem)) +} + +first_stem_after_start <- function(num_range) { + find_stem_after_start <- function(stem) { + if (stem_to_id(stem) >= num_range[[1]]) { + stem + } else { + find_stem_after_start(stem + 1) + } + } + + start_string <- as.character(num_range[[1]]) + if (has_even_length(start_string)) { + substr(start_string, 1, nchar(num_range[[1]]) / 2) |> + as.numeric() |> + find_stem_after_start() + } else { + 10^(floor(nchar(start_string) / 2)) + } +} + +is_stem_in_range <- function(stem, num_range) { + stem_repeated <- stem_to_id(stem) + (num_range[[1]] <= stem_repeated) && + (num_range[[2]] >= stem_repeated) +} + +stems_in_range <- function(num_range) { + add_stems_to_list <- function(stem, stems_list) { + if (is_stem_in_range(stem, num_range)) { + add_stems_to_list(stem + 1, c(stems_list, stem)) + } else { + stems_list + } + } + add_stems_to_list(first_stem_after_start(num_range), NULL) +} + +safer_sum <- function(x) { + if (length(x) < 1) { + 0 + } else { + sum(x) + } +} + +part1 <- function(input_string) { + input_ranges <- parse_input(input_string) + lapply(input_ranges, stems_in_range) |> + lapply(Vectorize(stem_to_id)) |> + vapply(safer_sum, numeric(1)) |> + sum() +} + +test_part1 <- function() { + stopifnot(part1(test_input) == 1227775554) +} + +main <- function() { + test_part1() + cat("Part 1 solution: ", part1(puzzle_input), "\n") +} + +main()