58 lines
1.4 KiB
Go
58 lines
1.4 KiB
Go
package day04
|
|
|
|
import (
|
|
"math"
|
|
"regexp"
|
|
"strconv"
|
|
"strings"
|
|
|
|
utils "git.anthonygueguen.fr/g3po/aoc2023/internal"
|
|
)
|
|
|
|
func GetResult(content []string) []int {
|
|
points := 0
|
|
nbr_card := 0
|
|
re := regexp.MustCompile(`\d+`)
|
|
distribution := make(map[int]int)
|
|
distribution[1] = 1
|
|
|
|
for i, line := range content {
|
|
current_card := i + 1
|
|
if _, ok := distribution[current_card]; !ok {
|
|
distribution[current_card] = 1
|
|
}
|
|
line = strings.Split(line, ":")[1]
|
|
split := strings.Split(line, "|")
|
|
set1, set2 := split[0], split[1]
|
|
winning_num := make(map[int]struct{})
|
|
num_count := 0
|
|
for _, n := range re.FindAllString(set1, -1) {
|
|
num := utils.Must(strconv.Atoi(n))
|
|
winning_num[num] = struct{}{}
|
|
}
|
|
for _, n := range re.FindAllString(set2, -1) {
|
|
num := utils.Must(strconv.Atoi(n))
|
|
if _, ok := winning_num[num]; ok {
|
|
num_count++
|
|
}
|
|
}
|
|
if num_count > 0 {
|
|
points += int(math.Pow(2.0, float64(num_count-1)))
|
|
for followin_card := 1; followin_card <= num_count; followin_card++ {
|
|
distribution_following_card := 1
|
|
if val, ok := distribution[current_card+followin_card]; ok {
|
|
distribution_following_card = val
|
|
}
|
|
distribution[current_card+followin_card] = distribution_following_card + distribution[current_card]
|
|
}
|
|
}
|
|
}
|
|
for i := 1; i <= len(content); i++ {
|
|
if _, ok := distribution[i]; !ok {
|
|
break
|
|
}
|
|
nbr_card += distribution[i]
|
|
}
|
|
return []int{points, nbr_card}
|
|
}
|