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)
}