advent_of_code/2023/04/cards.go
2023-12-10 16:37:39 +01:00

72 lines
1.3 KiB
Go

package main
import (
"slices"
"strconv"
"strings"
)
type Card struct {
id uint64
winning []uint64
guesses []uint64
correctGuesses int
}
func (c *Card) parseCard(input string) error {
initialSplit := strings.Split(input, ":")
idString := initialSplit[0][5:]
numberSplit := strings.Split(initialSplit[1], "|")
winningNumbers := strings.Split(numberSplit[0], " ")
guesses := strings.Split(numberSplit[1], " ")
var err error
c.id, err = strconv.ParseUint(strings.TrimSpace(idString), 10, 64)
if err != nil {
return err
}
for _, number := range winningNumbers {
number = strings.TrimSpace(number)
if len(number) == 0 {
continue
}
num, err := strconv.ParseUint(number, 10, 64)
if err != nil {
return err
}
c.winning = append(c.winning, num)
}
for _, number := range guesses {
number = strings.TrimSpace(number)
if len(number) == 0 {
continue
}
num, err := strconv.ParseUint(number, 10, 64)
if err != nil {
return err
}
c.guesses = append(c.guesses, num)
}
c.correctGuesses = 0
for _, guess := range c.guesses {
if slices.Contains(c.winning, guess) {
c.correctGuesses++
}
}
return nil
}
func (c *Card) getPoints() uint64 {
if c.correctGuesses == 0 {
return 0
}
var points uint64 = 1
for i := c.correctGuesses - 1; i > 0; i-- {
points *= 2
}
return points
}