102 lines
1.9 KiB
Go
102 lines
1.9 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
type Cube int
|
|
|
|
const (
|
|
RED Cube = iota
|
|
BLUE
|
|
GREEN
|
|
)
|
|
|
|
type CubeCount struct {
|
|
color Cube
|
|
count uint64
|
|
}
|
|
|
|
type Game struct {
|
|
id uint64
|
|
sets [][]CubeCount
|
|
maxRed uint64
|
|
maxBlue uint64
|
|
maxGreen uint64
|
|
}
|
|
|
|
func parseColor(color string) Cube {
|
|
if color == "red" {
|
|
return RED
|
|
}
|
|
if color == "green" {
|
|
return GREEN
|
|
}
|
|
return BLUE
|
|
}
|
|
|
|
func (g *Game) parseGame(input string) error {
|
|
initialSplit := strings.Split(input, ":")
|
|
setSplit := strings.Split(initialSplit[1], ";")
|
|
idString := initialSplit[0][5:]
|
|
|
|
var err error
|
|
g.id, err = strconv.ParseUint(idString, 10, 64)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
for _, set := range setSplit {
|
|
cubes := strings.Split(set, ",")
|
|
var parsedSet []CubeCount
|
|
|
|
for _, cube := range cubes {
|
|
var count uint64
|
|
var color string
|
|
fmt.Sscanf(strings.TrimSpace(cube), "%d %s", &count, &color)
|
|
parsedSet = append(parsedSet, CubeCount{parseColor(color), count})
|
|
}
|
|
g.sets = append(g.sets, parsedSet)
|
|
}
|
|
g.maxBlue = 0
|
|
g.maxGreen = 0
|
|
g.maxRed = 0
|
|
|
|
return nil
|
|
}
|
|
|
|
func (g *Game) resolveGame() {
|
|
for _, set := range g.sets {
|
|
for _, cubeCount := range set {
|
|
if cubeCount.color == RED && cubeCount.count > g.maxRed {
|
|
g.maxRed = cubeCount.count
|
|
} else if cubeCount.color == GREEN && cubeCount.count > g.maxGreen {
|
|
g.maxGreen = cubeCount.count
|
|
} else if cubeCount.color == BLUE && cubeCount.count > g.maxBlue {
|
|
g.maxBlue = cubeCount.count
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func (g *Game) canBePlayed(cubeSet [3]CubeCount) bool {
|
|
for _, cubeCount := range cubeSet {
|
|
if cubeCount.color == RED && cubeCount.count < g.maxRed {
|
|
return false
|
|
}
|
|
if cubeCount.color == GREEN && cubeCount.count < g.maxGreen {
|
|
return false
|
|
}
|
|
if cubeCount.color == BLUE && cubeCount.count < g.maxBlue {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
|
|
func (g *Game) getGamePower() uint64 {
|
|
return g.maxBlue * g.maxGreen * g.maxRed
|
|
}
|