59 lines
1.5 KiB
Go
59 lines
1.5 KiB
Go
package pokercore
|
|
|
|
import (
|
|
"errors"
|
|
)
|
|
|
|
var ErrDuplicateCard = errors.New("cannot score a poker hand out of a set of cards with duplicates")
|
|
|
|
// this method makes a n new hands where n is the number of cards in the hand
|
|
// each of the new hands has one card removed from the original hand
|
|
// then it calls the identifyBestFiveCardPokerHand method on each of the new hands
|
|
// and returns the best hand by score. this is recursion and is exponential in time complexity
|
|
func (hand Cards) IdentifyBestFiveCardPokerHand() (Cards, error) {
|
|
|
|
//fmt.Println("hand: ", hand)
|
|
if hand.containsDuplicates() {
|
|
return nil, ErrDuplicateCard
|
|
}
|
|
|
|
if len(hand) == 5 {
|
|
return hand, nil
|
|
}
|
|
|
|
if len(hand) < 5 {
|
|
return nil, errors.New("hand must have at least 5 cards to identify the best 5 card poker hand")
|
|
}
|
|
|
|
newHands := make([]Cards, len(hand))
|
|
for i := 0; i < len(hand); i++ {
|
|
newHand := make(Cards, len(hand)-1)
|
|
copy(newHand, hand[:i])
|
|
copy(newHand[i:], hand[i+1:])
|
|
//fmt.Printf("generating new subset of hand: %+v\n", newHand)
|
|
//fmt.Printf("this subset drops the card at index %d: %s\n", i, hand[i].String())
|
|
newHands[i] = newHand
|
|
}
|
|
//fmt.Printf("newHands: %+v\n", newHands)
|
|
var bestHand Cards
|
|
var bestScore HandScore
|
|
|
|
for _, h := range newHands {
|
|
if len(h) == 5 {
|
|
score, _ := h.PokerHandScore()
|
|
if score > bestScore {
|
|
bestScore = score
|
|
bestHand = h
|
|
}
|
|
} else {
|
|
rh, _ := h.IdentifyBestFiveCardPokerHand()
|
|
score, _ := rh.PokerHandScore()
|
|
if score > bestScore {
|
|
bestScore = score
|
|
bestHand = rh
|
|
}
|
|
}
|
|
}
|
|
return bestHand, nil
|
|
}
|