2023-12-02 13:20:53 +01:00

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
}