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