package main import ( "strings" "unicode" ) // Card represents a single card. // it tracks its number of matches and occurrences type Card struct { matches int occurrences int } var cards = []Card{} // one computes points based on matching numbers func one(lines []string) (int, error) { f := func(c rune) bool { return !unicode.IsDigit(c) } sum := 0 cards = make([]Card, len(lines)) for x, line := range lines { winning, mynums := func() (string, string) { y := strings.Split(line, ":") z := strings.Split(y[1], "|") return z[0], z[1] }() m, err := compare(strings.FieldsFunc(winning, f), strings.FieldsFunc(mynums, f)) if err != nil { return 0, err } cards[x].matches = m if cards[x].matches > 0 { sum += (pow(2, cards[x].matches-1)) } } return sum, nil }