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:
| A | src/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()