Day 2 was another fun challenge. Lots of splitting of strings. I wonder if there is a better way to filter out the min and max value from the separate grabs.
I am sure I will not be able to complete all challenges this year, but so far so good.
package main
import (
"fmt"
"os"
"strconv"
"strings"
)
type Grab struct {
red, green, blue int
}
type Game struct {
id int
grabs []Grab
}
func main() {
content, _ := os.ReadFile("2023/Day02/input.txt")
var input []Game
for g, l := range strings.Split(strings.TrimSpace(string(content)), "\n") {
game := Game{}
game.id = g + 1
parts := strings.Split(l, ":")
grabs := strings.Split(parts[1], ";")
for _, h := range grabs {
grab := Grab{}
for _, rgb := range strings.Split(h, ",") {
color := strings.Split(strings.TrimSpace(rgb), " ")
i, _ := strconv.Atoi(color[0])
switch color[1] {
case "red":
grab.red = i
case "green":
grab.green = i
case "blue":
grab.blue = i
}
}
game.grabs = append(game.grabs, grab)
}
input = append(input, game)
}
max := Grab{
red: 12,
green: 13,
blue: 14,
}
var possible []Game
outer:
for _, game := range input {
for _, grab := range game.grabs {
if grab.red > max.red || grab.green > max.green || grab.blue > max.blue {
continue outer
}
}
// fmt.Println("Possible game: ", game)
possible = append(possible, game)
}
sum := 0
for _, g := range possible {
sum += g.id
}
fmt.Println("Part 1: ", sum)
var powers []Grab
for _, game := range input {
min := Grab{
red: 0,
green: 0,
blue: 0,
}
for _, grab := range game.grabs {
if grab.red > min.red {
min.red = grab.red
}
if grab.green > min.green {
min.green = grab.green
}
if grab.blue > min.blue {
min.blue = grab.blue
}
}
powers = append(powers, min)
}
sum = 0
for _, x := range powers {
sum += x.red * x.green * x.blue
}
fmt.Println("Part 2: ", sum)
}