82 lines
1.8 KiB
Go
82 lines
1.8 KiB
Go
package day02
|
|
|
|
import (
|
|
"regexp"
|
|
"slices"
|
|
"strconv"
|
|
"strings"
|
|
|
|
utils "git.anthonygueguen.fr/g3po/aoc2023/internal"
|
|
)
|
|
|
|
const (
|
|
MAX_RED int = 12
|
|
MAX_GREEN = 13
|
|
MAX_BLUE = 14
|
|
)
|
|
|
|
const (
|
|
RED string = "red"
|
|
GREEN = "green"
|
|
BLUE = "blue"
|
|
)
|
|
|
|
func GetPossibleGame(content []string) []int {
|
|
var idx []int
|
|
lines:
|
|
for i, line := range content {
|
|
line := strings.Split(line, ":")[1]
|
|
sets := strings.Split(line, ";")
|
|
for _, set := range sets {
|
|
red, green, blue := 0, 0, 0
|
|
words := strings.Split(set, " ")
|
|
for k, w := range words {
|
|
switch w {
|
|
case RED, RED + ",":
|
|
red += utils.Must[int](strconv.Atoi(words[k-1]))
|
|
if red > MAX_RED {
|
|
continue lines
|
|
}
|
|
case GREEN, GREEN + ",":
|
|
green += utils.Must[int](strconv.Atoi(words[k-1]))
|
|
if green > MAX_GREEN {
|
|
continue lines
|
|
}
|
|
case BLUE, BLUE + ",":
|
|
blue += utils.Must[int](strconv.Atoi(words[k-1]))
|
|
if blue > MAX_BLUE {
|
|
continue lines
|
|
}
|
|
}
|
|
}
|
|
}
|
|
idx = append(idx, i+1)
|
|
}
|
|
return idx
|
|
}
|
|
|
|
func GetPowerOfGame(content []string) []int {
|
|
var power []int
|
|
r := regexp.MustCompile(`(\d)* (blue|red|green)`)
|
|
for _, line := range content {
|
|
var red, green, blue []int
|
|
cubes := r.FindAllString(line, -1)
|
|
for _, c := range cubes {
|
|
switch {
|
|
case strings.Contains(c, RED):
|
|
val := utils.Must[int](strconv.Atoi(strings.Split(c, " ")[0]))
|
|
red = append(red, val)
|
|
case strings.Contains(c, GREEN):
|
|
val := utils.Must[int](strconv.Atoi(strings.Split(c, " ")[0]))
|
|
green = append(green, val)
|
|
case strings.Contains(c, BLUE):
|
|
val := utils.Must[int](strconv.Atoi(strings.Split(c, " ")[0]))
|
|
blue = append(blue, val)
|
|
}
|
|
}
|
|
p := slices.Max(red) * slices.Max(green) * slices.Max(blue)
|
|
power = append(power, p)
|
|
}
|
|
return power
|
|
}
|