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 2667cb9f1c74814e781af0a7dbf2a4693da555c4
parent aa551c12b65a4f1adad9a7b2a233f37efd52629e
Author: Eamon Caddigan <ec@eamoncaddigan.net>
Date:   Mon,  8 Dec 2025 15:24:46 -0800

Solve day 08, part 2

Diffstat:
Msrc/day08.R | 25++++++++++++++++++++-----
1 file changed, 20 insertions(+), 5 deletions(-)

diff --git a/src/day08.R b/src/day08.R @@ -38,7 +38,7 @@ order_distances <- function(distmat) { which(lower.tri(distmat), arr.ind = TRUE)[order(distmat), ] } -greedy_connect <- function(coords, steps) { +greedy_connect <- function(coords, max_steps = NULL) { # Circuit IDs for each junction box coord_circuits <- seq_len(nrow(coords)) # Junction box (coordinate) IDs for each circuit @@ -47,29 +47,31 @@ greedy_connect <- function(coords, steps) { pair_order <- coords |> dist() |> order_distances() - stopifnot(steps <= nrow(pair_order)) - for (i in seq_len(steps)) { + max_steps <- min(max_steps, nrow(pair_order)) + for (i in seq_len(max_steps)) { c1 <- coord_circuits[pair_order[i, 1]] c2 <- coord_circuits[pair_order[i, 2]] if (c1 < c2) { coord_circuits[circuit_coords[[c2]]] <- c1 circuit_coords[[c1]] <- union(circuit_coords[[c1]], circuit_coords[[c2]]) circuit_coords[c2] <- list(NULL) + if (length(circuit_coords[[c1]]) == nrow(coords)) break } else if (c1 > c2) { coord_circuits[circuit_coords[[c1]]] <- c2 circuit_coords[[c2]] <- union(circuit_coords[[c1]], circuit_coords[[c2]]) circuit_coords[c1] <- list(NULL) + if (length(circuit_coords[[c2]]) == nrow(coords)) break } } - circuit_coords + list(circuits = circuit_coords, last_pair = pair_order[i, ]) } part1 <- function(input_lines, steps) { input_lines |> parse_input() |> - greedy_connect(steps) |> + (\(x) greedy_connect(x, steps)$circuits)() |> vapply(length, integer(1)) |> sort(decreasing = TRUE) |> (\(x) prod(x[1:3]))() @@ -79,9 +81,22 @@ test_part1 <- function() { stopifnot(part1(test_input, 10) == 40) } +part2 <- function(input_lines) { + coords <- parse_input(input_lines) + last_pair <- greedy_connect(coords)$last_pair + + prod(coords[last_pair, ][, 1]) +} + +test_part2 <- function() { + stopifnot(part2(test_input) == 25272) +} + main <- function() { test_part1() cat("Part 1 solution: ", part1(puzzle_input, 1000), "\n") + test_part2() + cat("Part 2 solution: ", part2(puzzle_input), "\n") } main()