day02
This commit is contained in:
119
2023/go/day02/day02.go
Normal file
119
2023/go/day02/day02.go
Normal file
@@ -0,0 +1,119 @@
|
||||
package day02
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"regexp"
|
||||
_ "strconv"
|
||||
"strings"
|
||||
|
||||
"adventofcode2023/utils"
|
||||
)
|
||||
|
||||
type Set struct {
|
||||
Red int
|
||||
Blue int
|
||||
Green int
|
||||
}
|
||||
|
||||
type Game struct {
|
||||
ID int
|
||||
Sets []Set
|
||||
}
|
||||
|
||||
func Part1(input string) int {
|
||||
sum := 0
|
||||
games := []Game{}
|
||||
|
||||
lines := strings.Split(input, "\n")
|
||||
for _, line := range lines {
|
||||
game, err := parseGame(line)
|
||||
if err != nil {
|
||||
fmt.Println("Error:", err)
|
||||
return -1
|
||||
}
|
||||
// Print the parsed Game struct
|
||||
fmt.Printf("Parsed Game: %+v\n", game)
|
||||
games = append(games, game)
|
||||
}
|
||||
for _, game := range games {
|
||||
result := true
|
||||
for _, set := range game.Sets {
|
||||
if set.Red > 12 || set.Green > 13 || set.Blue > 14 {
|
||||
result = false
|
||||
}
|
||||
}
|
||||
if result == true {
|
||||
sum += game.ID
|
||||
}
|
||||
}
|
||||
return sum
|
||||
}
|
||||
|
||||
func Part2(input string) int {
|
||||
sum := 0
|
||||
games := []Game{}
|
||||
|
||||
lines := strings.Split(input, "\n")
|
||||
for _, line := range lines {
|
||||
game, err := parseGame(line)
|
||||
if err != nil {
|
||||
fmt.Println("Error:", err)
|
||||
return -1
|
||||
}
|
||||
// Print the parsed Game struct
|
||||
fmt.Printf("Parsed Game: %+v\n", game)
|
||||
games = append(games, game)
|
||||
}
|
||||
for _, game := range games {
|
||||
maxRed := 0
|
||||
maxBlue := 0
|
||||
maxGreen := 0
|
||||
for _, set := range game.Sets {
|
||||
if set.Red > maxRed {
|
||||
maxRed = set.Red
|
||||
}
|
||||
if set.Blue > maxBlue {
|
||||
maxBlue = set.Blue
|
||||
}
|
||||
if set.Green > maxGreen {
|
||||
maxGreen = set.Green
|
||||
}
|
||||
}
|
||||
sum += maxRed * maxBlue * maxGreen
|
||||
}
|
||||
return sum
|
||||
}
|
||||
|
||||
func parseGame(input string) (Game, error) {
|
||||
var game Game
|
||||
|
||||
// Extract ID
|
||||
reID := regexp.MustCompile(`Game (\d+):(.*)`)
|
||||
matchID := reID.FindStringSubmatch(input)
|
||||
if len(matchID) != 3 {
|
||||
return game, fmt.Errorf("unable to extract game ID")
|
||||
}
|
||||
game.ID = utils.MustAtoi(matchID[1])
|
||||
setsString := strings.Split(matchID[2], ";")
|
||||
for _, setString := range setsString {
|
||||
var set Set
|
||||
// Extract colors and quantities
|
||||
reColors := regexp.MustCompile(`(\d+) (\w+)`)
|
||||
matches := reColors.FindAllStringSubmatch(setString, -1)
|
||||
for _, match := range matches {
|
||||
color := strings.ToLower(match[2])
|
||||
switch color {
|
||||
case "red":
|
||||
set.Red = utils.MustAtoi(match[1])
|
||||
case "blue":
|
||||
set.Blue = utils.MustAtoi(match[1])
|
||||
case "green":
|
||||
set.Green = utils.MustAtoi(match[1])
|
||||
default:
|
||||
return game, fmt.Errorf("unknown color: %s", color)
|
||||
}
|
||||
}
|
||||
game.Sets = append(game.Sets, set)
|
||||
}
|
||||
return game, nil
|
||||
}
|
||||
Reference in New Issue
Block a user