Advent of Code 2023 Day 2

Advent of Code
Author

Ryan Heslin

Published

December 3, 2023

Day 2, fortunately, proved easier than day 1. The puzzle gives results of draws of red, green, and blue items from bags. Part 1 asks to find which draws were possible given certain numbers of each item. Part 2 asks to find the minimum number of items to make each draw valid.

The computations proved trivial. Most of the challenge came in parsing the input, which looked like this:

Game 1: 3 blue, 4 red; 1 red, 2 green, 6 blue; 2 green
Game 2: 1 blue, 2 green; 3 green, 4 blue, 1 red; 1 green, 1 blue
Game 3: 8 green, 6 blue, 20 red; 5 blue, 4 red, 13 green; 5 green, 1 red
Game 4: 1 green, 3 red, 6 blue; 3 green, 6 red; 3 green, 15 blue, 14 red
Game 5: 6 red, 1 blue, 3 green; 2 blue, 1 red, 2 green

I used R for vectorized arithmetic. I ended up using several rounds of string splitting to extract the data:

parse_pairs <- function(pairs) {
    splits <- strsplit(pairs, " ") |> unlist()
    n <- length(splits)
    even <- seq(2, n, 2)
    # Since values come in value-color pairs
    result <- colors
    present <- splits[even]
    result[present] <- strtoi(splits[even - 1])
    result
}

parse_line <- function(line) {
    line <- sub("^Game \\d+:\\s+", "", line)
    # browser()
    draws <- strsplit(line, ";\\s+") |> unlist()
    pairs <- strsplit(draws, ",\\s+")
    lapply(pairs, parse_pairs) |>
        do.call(what = cbind)
}