package day4 import ( "fmt" "regexp" "strings" "gitea.paas.celticinfo.fr/oabrivard/aoc2023/utils" ) func WinningNumbersSum(lines []string) int { result := 0 var re1 = regexp.MustCompile(`Card\s+([0-9]+):(.*)`) for _, l := range lines { matches := re1.FindStringSubmatch(l) if len(matches) < 3 { fmt.Printf("'%s'\n", l) } restOfLine := matches[2] lists := strings.Split(restOfLine, "|") winnings := make([]bool, 101) a := utils.ParseIntArray(lists[0], " ") for _, w := range a { winnings[w] = true } count := 0 cards := utils.ParseIntArray(lists[1], " ") for _, c := range cards { if winnings[c] { count++ } } if count > 0 { result += utils.IntPow(2, count-1) } } return result } func ScratchCopyCount(lines []string) int { matchingCount := make([]int, len(lines)) var re1 = regexp.MustCompile(`Card\s+([0-9]+):(.*)`) for i, l := range lines { matches := re1.FindStringSubmatch(l) if len(matches) < 3 { fmt.Printf("Error at line %d : '%s'\n", i, l) } //card := matches[1] restOfLine := matches[2] lists := strings.Split(restOfLine, "|") winnings := make([]bool, 101) a := utils.ParseIntArray(lists[0], " ") for _, w := range a { winnings[w] = true } count := 0 cards := utils.ParseIntArray(lists[1], " ") for _, c := range cards { if winnings[c] { count++ } } matchingCount[i] = count } copyCount := make([]int, len(lines)) for i := range copyCount { copyCount[i] = 1 // initial deck count for 1 copy } for i, v := range matchingCount { if v > 0 { for j := copyCount[i]; j > 0; j-- { // this loop is to take the previous copies into account for k := 0; k < v; k++ { copyCount[i+k+1]++ } } } } result := 0 for _, v := range copyCount { result += v } return result }