9 "adventofcode2023/utils"
23 func Part1(input string) int {
27 lines := strings.Split(input, "\n")
28 for _, line := range lines {
29 game, err := parseGame(line)
31 fmt.Println("Error:", err)
34 // Print the parsed Game struct
35 fmt.Printf("Parsed Game: %+v\n", game)
36 games = append(games, game)
38 for _, game := range games {
40 for _, set := range game.Sets {
41 if set.Red > 12 || set.Green > 13 || set.Blue > 14 {
52 func Part2(input string) int {
56 lines := strings.Split(input, "\n")
57 for _, line := range lines {
58 game, err := parseGame(line)
60 fmt.Println("Error:", err)
63 // Print the parsed Game struct
64 fmt.Printf("Parsed Game: %+v\n", game)
65 games = append(games, game)
67 for _, game := range games {
71 for _, set := range game.Sets {
75 if set.Blue > maxBlue {
78 if set.Green > maxGreen {
82 sum += maxRed * maxBlue * maxGreen
87 func parseGame(input string) (Game, error) {
91 reID := regexp.MustCompile(`Game (\d+):(.*)`)
92 matchID := reID.FindStringSubmatch(input)
93 if len(matchID) != 3 {
94 return game, fmt.Errorf("unable to extract game ID")
96 game.ID = utils.MustAtoi(matchID[1])
97 setsString := strings.Split(matchID[2], ";")
98 for _, setString := range setsString {
100 // Extract colors and quantities
101 reColors := regexp.MustCompile(`(\d+) (\w+)`)
102 matches := reColors.FindAllStringSubmatch(setString, -1)
103 for _, match := range matches {
104 color := strings.ToLower(match[2])
107 set.Red = utils.MustAtoi(match[1])
109 set.Blue = utils.MustAtoi(match[1])
111 set.Green = utils.MustAtoi(match[1])
113 return game, fmt.Errorf("unknown color: %s", color)
116 game.Sets = append(game.Sets, set)