347 lines
7.0 KiB
Go
347 lines
7.0 KiB
Go
package thirteen
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
// 牌序- A, K, Q, J,10, 9, 8, 7, 6, 5, 4, 3, 2
|
|
// 黑桃-51,50,49,48,47,46,45,44,43,42,41,40,39
|
|
// 红桃-38,37,36,35,34,33,32,31,30,29,28,27,26
|
|
// 梅花-25,24,23,22,21,20,19,18,17,16,15,14,13
|
|
// 方片-12,11,10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0
|
|
var pokersTest = []int{12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 38,
|
|
37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39}
|
|
|
|
var pokers2Test = append(pokersTest, pokersTest...)
|
|
|
|
func arrEqual(a, b [][]int) bool {
|
|
if len(a) != len(b) {
|
|
return false
|
|
}
|
|
|
|
for i := 0; i < len(a); i++ {
|
|
if len(a[i]) != len(b[i]) {
|
|
return false
|
|
}
|
|
|
|
cp := make([]int, len(a[i]))
|
|
copy(cp, a[i])
|
|
for _, v := range b[i] {
|
|
cp = DelCards(cp, []int{v})
|
|
}
|
|
if len(cp) > 0 {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
|
|
type item struct {
|
|
cards []int
|
|
lai []int
|
|
target []int
|
|
}
|
|
|
|
func goResult(cards []int) string {
|
|
buf := strings.Builder{}
|
|
buf.WriteString("[]int{")
|
|
|
|
for m, n := range cards {
|
|
buf.WriteString(fmt.Sprint(n))
|
|
if m < len(cards)-1 {
|
|
buf.WriteString(",")
|
|
}
|
|
}
|
|
|
|
buf.WriteString("}")
|
|
return buf.String()
|
|
}
|
|
|
|
func printTest(t *testing.T, cards []int, target, result, change []int) {
|
|
// 牌应该都在原牌堆中存在,这里检查一下
|
|
for _, vv := range result {
|
|
has := false
|
|
for _, c := range cards {
|
|
if vv == c {
|
|
has = true
|
|
}
|
|
}
|
|
if !has {
|
|
t.Logf("%v,%v 不存在\n", PokerName(vv), vv)
|
|
}
|
|
}
|
|
|
|
t.Logf("goResult: %s", goResult(result))
|
|
t.Fatal()
|
|
}
|
|
|
|
func findFuncTest(t *testing.T, data []item, find func([]int, []int) ([]int, []int)) {
|
|
for _, v := range data {
|
|
result, change := find(v.cards, v.lai)
|
|
t.Logf(" cards: %s\n", PokersShow(v.cards))
|
|
t.Logf(" cards: %v\n", v.cards)
|
|
t.Logf("target: %s %v\n", PokersShow(v.target), v.target)
|
|
t.Logf("result: %s %v \n", PokersShow(result), result)
|
|
t.Logf("change: %s %v \n\n", PokersShow(change), change)
|
|
if !arrEqual([][]int{v.target}, [][]int{result}) {
|
|
printTest(t, v.cards, v.target, result, change)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestFindMaxPairs(t *testing.T) {
|
|
data := []item{
|
|
{
|
|
cards: []int{9, 8, 7, 6, 5, 20, 19, 18, 17, 16, 32, 31, 30, 29, 28, 27, 26, 38},
|
|
target: []int{20, 7},
|
|
},
|
|
{
|
|
cards: []int{5, 4, 3, 2, 1, 0, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13},
|
|
target: []int{18, 5},
|
|
},
|
|
{
|
|
cards: pokers2Test,
|
|
target: []int{51, 51},
|
|
},
|
|
{
|
|
cards: pokers2Test,
|
|
lai: []int{52, 53},
|
|
target: []int{51, 51},
|
|
},
|
|
{
|
|
cards: []int{51, 0, 2, 3, 52, 53},
|
|
lai: []int{52, 53},
|
|
target: []int{51, 53},
|
|
},
|
|
{
|
|
cards: []int{1, 0, 2, 3, 52, 53},
|
|
lai: []int{52, 53},
|
|
target: []int{53, 52},
|
|
},
|
|
}
|
|
findFuncTest(t, data, FindMaxPairs)
|
|
}
|
|
|
|
func TestFindMaxThreeAAA(t *testing.T) {
|
|
data := []item{
|
|
{
|
|
cards: pokersTest,
|
|
target: []int{25, 38, 51},
|
|
},
|
|
{
|
|
cards: pokers2Test,
|
|
target: []int{51, 51, 38},
|
|
},
|
|
{
|
|
cards: []int{51, 0, 2, 3, 52, 53},
|
|
lai: []int{52, 53},
|
|
target: []int{51, 53, 52},
|
|
},
|
|
{
|
|
cards: []int{1, 0, 2, 3, 52, 53},
|
|
lai: []int{52, 53},
|
|
target: []int{3, 53, 52},
|
|
},
|
|
{
|
|
cards: []int{1, 0, 2, 3, 52, 53, 52},
|
|
lai: []int{52, 53},
|
|
target: []int{53, 52, 52},
|
|
},
|
|
}
|
|
findFuncTest(t, data, FindMaxThreeAAA)
|
|
}
|
|
|
|
func TestFindMaxFlush(t *testing.T) {
|
|
data := []item{
|
|
{
|
|
cards: pokersTest,
|
|
target: []int{47, 48, 49, 50, 51},
|
|
},
|
|
{
|
|
cards: []int{12, 3, 2, 1, 0},
|
|
target: []int{12, 0, 1, 2, 3},
|
|
},
|
|
{
|
|
cards: pokers2Test,
|
|
target: []int{47, 48, 49, 50, 51},
|
|
},
|
|
{
|
|
cards: []int{0, 1, 2, 3, 4, 5},
|
|
lai: []int{52, 53},
|
|
target: []int{5, 4, 3, 2, 1},
|
|
},
|
|
{
|
|
cards: []int{0, 2, 4, 5, 7, 8, 52, 53},
|
|
lai: []int{52, 53},
|
|
target: []int{53, 8, 7, 52, 5},
|
|
},
|
|
{
|
|
cards: []int{0, 2, 4, 8, 9, 10, 52, 53},
|
|
lai: []int{52, 53},
|
|
target: []int{53, 52, 10, 9, 8},
|
|
},
|
|
{
|
|
cards: []int{51, 0, 1, 2, 4, 6, 52, 53},
|
|
lai: []int{52, 53},
|
|
target: []int{6, 53, 4, 52, 2},
|
|
},
|
|
{
|
|
cards: []int{51, 0, 1, 2, 8, 9, 52, 53},
|
|
lai: []int{52, 53},
|
|
target: []int{51, 53, 52, 9, 8},
|
|
},
|
|
{
|
|
cards: []int{51, 0, 1, 2, 8, 52},
|
|
lai: []int{52, 53},
|
|
target: []int{52, 2, 1, 0, 51},
|
|
},
|
|
}
|
|
findFuncTest(t, data, FindMaxFlush)
|
|
}
|
|
|
|
func TestFindMaxSameColors(t *testing.T) {
|
|
data := []item{
|
|
{
|
|
cards: pokersTest,
|
|
target: []int{47, 48, 49, 50, 51},
|
|
},
|
|
{
|
|
cards: pokers2Test,
|
|
target: []int{49, 50, 50, 51, 51},
|
|
},
|
|
{
|
|
cards: []int{39, 38, 34, 33, 30},
|
|
target: []int{},
|
|
},
|
|
{
|
|
cards: []int{51, 0, 1, 2, 8, 52},
|
|
lai: []int{52, 53},
|
|
target: []int{8, 2, 1, 0, 52},
|
|
},
|
|
{
|
|
cards: []int{51, 0, 1, 2, 22, 52, 53},
|
|
lai: []int{52, 53},
|
|
target: []int{2, 1, 0, 53, 52},
|
|
},
|
|
{
|
|
cards: []int{51, 50, 1, 2, 22, 52, 53, 52},
|
|
lai: []int{52, 53},
|
|
target: []int{51, 50, 53, 52, 52},
|
|
},
|
|
}
|
|
findFuncTest(t, data, FindMaxSameColors)
|
|
}
|
|
|
|
func TestFindMaxGourdCards(t *testing.T) {
|
|
data := []item{
|
|
{
|
|
cards: pokersTest,
|
|
target: []int{25, 37, 38, 50, 51},
|
|
},
|
|
{
|
|
cards: pokers2Test,
|
|
target: []int{51, 51, 38, 38, 25},
|
|
},
|
|
{
|
|
cards: []int{51, 50, 1, 2, 22, 52, 53, 52},
|
|
lai: []int{52, 53},
|
|
target: []int{51, 53, 52, 50, 52},
|
|
},
|
|
{
|
|
cards: []int{51, 12, 50, 1, 2, 22, 52, 53, 52},
|
|
lai: []int{52, 53},
|
|
target: []int{51, 12, 53, 52, 52},
|
|
},
|
|
}
|
|
findFuncTest(t, data, FindMaxGourdCards)
|
|
}
|
|
|
|
func TestFindMaxFourAAAA(t *testing.T) {
|
|
data := []item{
|
|
{
|
|
cards: pokersTest,
|
|
target: []int{12, 25, 38, 51},
|
|
},
|
|
{
|
|
cards: pokers2Test,
|
|
target: []int{51, 51, 38, 38},
|
|
},
|
|
{
|
|
cards: []int{51, 12, 50, 1, 2, 22, 52, 53, 52},
|
|
lai: []int{52, 53},
|
|
target: []int{51, 12, 53, 52},
|
|
},
|
|
{
|
|
cards: []int{12, 50, 1, 2, 22, 52, 53, 52},
|
|
lai: []int{52, 53},
|
|
target: []int{12, 53, 52, 52},
|
|
},
|
|
{
|
|
cards: []int{50, 1, 2, 22, 52, 53, 52, 52},
|
|
lai: []int{52, 53},
|
|
target: []int{53, 52, 52, 52},
|
|
},
|
|
{
|
|
cards: []int{50, 1, 2, 22, 52, 53, 52},
|
|
lai: []int{52, 53},
|
|
target: []int{50, 53, 52, 52},
|
|
},
|
|
}
|
|
findFuncTest(t, data, FindMaxFourAAAA)
|
|
}
|
|
|
|
func TestFindMaxSameColorFlush(t *testing.T) {
|
|
data := []item{
|
|
{
|
|
cards: pokersTest,
|
|
target: []int{47, 48, 49, 50, 51},
|
|
},
|
|
{
|
|
cards: pokers2Test,
|
|
target: []int{47, 48, 49, 50, 51},
|
|
},
|
|
{
|
|
cards: []int{50, 1, 2, 22, 52, 53, 52},
|
|
lai: []int{52, 53},
|
|
target: []int{53, 52, 52, 2, 1},
|
|
},
|
|
{
|
|
cards: []int{0, 1, 2, 4, 9, 52},
|
|
lai: []int{52, 53},
|
|
target: []int{4, 52, 2, 1, 0},
|
|
},
|
|
{
|
|
cards: []int{12, 1, 2, 3, 9, 52},
|
|
lai: []int{52, 53},
|
|
target: []int{3, 2, 1, 52, 12},
|
|
},
|
|
}
|
|
findFuncTest(t, data, FindMaxSameColorFlush)
|
|
}
|
|
|
|
func TestFindMaxFive(t *testing.T) {
|
|
data := []item{
|
|
{
|
|
cards: pokersTest,
|
|
target: []int{},
|
|
},
|
|
{
|
|
cards: pokers2Test,
|
|
target: []int{51, 51, 38, 38, 25},
|
|
},
|
|
{
|
|
cards: []int{50, 1, 2, 22, 52, 53, 52},
|
|
lai: []int{52, 53},
|
|
target: []int{},
|
|
},
|
|
{
|
|
cards: []int{51, 51, 51, 51, 12, 52},
|
|
lai: []int{52, 53},
|
|
target: []int{51, 51, 51, 51, 12},
|
|
},
|
|
}
|
|
findFuncTest(t, data, FindMaxFive)
|
|
}
|