Day 6: Probably a Fire Hazard

Reference

library(tidyverse)
library(scales)

input <- read_lines(file = "inputs/2015/06.txt")

Part One

instructions <- tibble(raw = input) |> 
    mutate(
        instruction = str_extract(raw, "toggle|turn on|turn off"),
        coords = str_extract_all(raw, "[0-9]+")
    ) |> 
    unnest_wider(coords, names_sep = "_") |>
    rename(
        x_start = coords_1,
        y_start = coords_2,
        x_end = coords_3,
        y_end = coords_4
    ) |>
    mutate(across(matches("^[xy]"), \(x) as.integer(x) + 1L)) |> # Convert to 1-indexed for R
    mutate(
        x_range = map2(x_start, x_end, \(a, b) a:b),
        y_range = map2(y_start, y_end, \(a, b) a:b)
    )

action <- function(instruction, x_range, y_range, grid) {
    grid[x_range, y_range] <- switch(
        instruction,
        "toggle"   = !grid[x_range, y_range],
        "turn on"  = TRUE,
        "turn off" = FALSE
    )
    return(grid)
}

lights <- instructions |> 
    mutate(
        grid = accumulate(
            .x = row_number(),
            .f = \(grid, i) action(
                instruction = instruction[i],
                x_range     = x_range[[i]],
                y_range     = y_range[[i]],
                grid        = grid
            ),
            .init = matrix(FALSE, 1e3, 1e3)
        ) |> tail(-1) # Remove the initial grid (.init) from results
    ) |>  
    mutate(lights_on = map_int(grid, sum))

total_lights_on <- lights |> tail(1) |> pull(lights_on)
cat("Total lights on:", total_lights_on, "\n")
## Total lights on: 543903

Part Two

new_action <- function(instruction, x_range, y_range, grid) {
    grid[x_range, y_range] <- switch(
        instruction,
        "toggle"   = grid[x_range, y_range] + 2,
        "turn on"  = grid[x_range, y_range] + 1,
        "turn off" = pmax(grid[x_range, y_range] - 1, 0)
    )
    return(grid)
}

brightness <- instructions |> 
    mutate(
        grid = accumulate(
            .x = row_number(),
            .f = \(grid, i) new_action(
                instruction = instruction[i],
                x_range     = x_range[[i]],
                y_range     = y_range[[i]],
                grid        = grid
            ),
            .init = matrix(0, 1e3, 1e3)
        ) |> tail(-1) # Remove the initial grid (.init) from results
    ) |>  
    mutate(total_brightness = map_int(grid, sum))

total_brightness <- brightness |> tail(1) |> pull(total_brightness)
cat("Total brightness:", total_brightness, "\n")
## Total brightness: 14687245