Day 2: Cube Conundrum

Reference

library(tidyverse)

input <- read_lines(file = "inputs/2023/02.txt")

Part One

extract_number <- function(x) {
    as.integer(str_extract(string = x, pattern = "\\d+"))
}

extract_color <- function(x, color) {
    out <- extract_number(str_extract(x, pattern = paste("\\d+", color)))
    
    coalesce(out, 0)
}

possible_extraction <- function(extraction) {
    limits <- c(red = 12, green = 13, blue = 14)
    
    comparison <- names(limits) |> 
        map_int(\(color) extract_color(extraction, color))
    
    comparison <- comparison <= limits
    
    reduce(comparison, `&`)
}

possible_game <- function(game) {
    game |> 
        str_split_1(pattern = "; ") |> 
        map_lgl(possible_extraction) |> 
        reduce(`&`)
}

possible_games <- tibble(original = input) |> 
    separate_wider_delim(original,
                         delim = ": ",
                         names = c("game_number", "game"),
                         cols_remove = FALSE) |> 
    mutate(game_number   = extract_number(game_number),
           possible_game = map_lgl(game, possible_game))

possible_games |> 
    filter(possible_game) |> 
    summarise(game_number_sum = sum(game_number)) |> 
    pull(game_number_sum) |> 
    cat()
## 2204

Part Two

game_max_color <- function(game, color) {
    str_extract_all(game, pattern = paste("\\d+", color)) |> 
        map(extract_number) |> 
        unlist() |> 
        max()
}

game_power <- function(game) {
    c("red", "green", "blue") |> 
        map_int(\(color) game_max_color(game, color)) |> 
        prod()
}

games_power <- tibble(original = input) |> 
    separate_wider_delim(original,
                         delim = ": ",
                         names = c("game_number", "game"),
                         cols_remove = FALSE) |> 
    mutate(game_power = map_int(game, game_power))

games_power |> 
    summarise(game_power_sum = sum(game_power)) |> 
    pull(game_power_sum) |> 
    cat()
## 71036