commit d32cd88acd6b005a1c5cd24115b77e3f2ca36690
parent 73884c8c0620108bf6ceb73f153bcaf59eaa8309
Author: Eamon Caddigan <ec@eamoncaddigan.net>
Date: Mon, 8 Dec 2025 13:34:58 -0800
Solve day 07, part 2
Diffstat:
1 file changed, 19 insertions(+), 8 deletions(-)
diff --git a/src/day07.R b/src/day07.R
@@ -39,36 +39,47 @@ rshift <- function(x, fill = vector(mode = class(x), length = 1)) {
trace_beams_one_step <- function(manifold_row, beams_in) {
# This returns the number of splits as well as the updated beams in order to
# solve part 1
- splits <- manifold_row == "^" & beams_in
+ splits <- (manifold_row == "^") * beams_in
list(
- num_splits = sum(splits),
- beams_out = manifold_row == "S" | manifold_row == "." & beams_in |
- lshift(splits) | rshift(splits)
+ num_splits = sum(splits > 0),
+ beams_out = (manifold_row == "S") + ((manifold_row == ".") * beams_in) +
+ lshift(splits) + rshift(splits)
)
}
-count_splits <- function(manifold) {
+trace_beams <- function(manifold) {
num_splits <- 0
- beams <- rep(FALSE, ncol(manifold))
+ beams <- rep(0.0, ncol(manifold))
for (i in seq_len(nrow(manifold))) {
res <- trace_beams_one_step(manifold[i, ], beams)
num_splits <- num_splits + res$num_splits
beams <- res$beams_out
}
- num_splits
+ list(num_splits = num_splits, beams_out = beams)
}
part1 <- function(input_lines) {
- count_splits(parse_input(input_lines))
+ trace_beams(parse_input(input_lines))$num_splits
}
test_part1 <- function() {
stopifnot(part1(test_input) == 21)
}
+part2 <- function(input_lines) {
+ sum(trace_beams(parse_input(input_lines))$beams_out)
+}
+
+test_part2 <- function() {
+ stopifnot(part2(test_input) == 40)
+}
+
main <- function() {
+ # It's not remotely efficient to solve the puzzle twice, but it's fine
test_part1()
cat("Part 1 solution: ", part1(puzzle_input), "\n")
+ test_part2()
+ cat(sprintf("Part 2 solution: %0.0f\n", part2(puzzle_input)))
}
main()