您的位置:首页 > 编程语言 > Python开发

一道经典试题的Python实现

2017-01-20 16:56 351 查看
一手牌是五张,根据牌的花色和分值得出这一手的分值,分值最高的那一手牌就是一局的赢家。

一手牌的类型和分值级别如下:

0- High Card(比如黑桃3,方块6,红桃9,梅花J,黑桃Q)

1- One Pair(比如3,3,6,8,J)

2- Two Pair(比如3,3,5,5,7)

3- Three of a Kind(比如3,3,3,5,8,其中的3,3,3即为Three of a Kind)

4- Straight(顺子,比如2,3,4,5,6)

5- Flush(同花,比如全部为红桃)

6- Full House (OnePair+Three kind,比如2,2,4,4,4)

7- Four of a Kind(比如4,4,4,4)

8- Straight Flush (Straight and Flush,同花顺,比如全部为红桃,2,3,4,5,6就是同花顺)

特别说明:

1、 限定只有一副牌

2、 A,2,3,4,5也是Straight。

3、 如果两手牌的分值一样,那么也要比较出大小。比如两个同花顺,需要比较两手牌中的最小分值,大者为赢,比如2,3,4,5,6和4,5,6,7,8,显然4,5,6,7,8是赢家。

4、 花色之间无大小区别。

5、 花色用下列字母表示S:方块,C:梅花,H:红桃,D:黑桃。

6、 10用“T”表示。

测试用例说明:

测试用例需要满足下列条件:

1) 构造测试用例容易;

2) 输入采用如下格式

一手牌:”2S 5H 7C 8D 9S”

多手牌:”2S 5H 7C 8D 9S | 2S 2C 4H 5D 7C ”

3) 输出采用如下格式:

一手牌:”2S 5H 7C 8D 9S”

多手牌:”2S 5H 7C 8D 9S | 2H 2C 7H 8D 9C “

测试用例举例:

1、TestCase1

输入:

“2S 5H 7C 8D 9S | 2S 2C 4H 5D 7C | 2S 2C 4H 4D 7C | 2S 2D 2C 4H 6S | 2S 4S 5S 7S 8S | 2S 3D 4C 5D 6H | 2S 2D 2C 3H 3S | 2S 2D 2C 2H 6S | 2S 3S 4S 5S 6S”

输出:”2S 3S 4S 5S 6S”

2、TestCase2

输入:

“2S 3S 4S 5S AS | 3S 4S 5S 6S 7S”

输出:”3S 4S 5S 6S 7S”

3、TestCase3

输入:

“2S 2C 4H 4D 7C | 2S 2C 6H 6D 7C”

输出:”2S 2C 6H 6D 7C”

4、TestCase4

输入:

“2S 2C 6H 6D 8C | 2S 2C 6H 6D 9C”

输出:”2S 2C 6H 6D 9C”

编程说明:

1、 编程语言不限C/C++/JAVA/Python均可。

2、 代码提供的API接口函数统一命名为poker。输入和输出,见测试用例说明部分。。

3、 运行操作系统:Windows。

Rank_Table = {(4,1):7, (3,2):6, (3,1,1):3, (2,2,1):2, (2,1,1,1):1, (1,1,1,1,1):0}

def poker(hands):
return max(hands, key = hand_rank)

def hand_rank(hand):
crs = group(sorted(["--23456789TJQKA".index(r) for r, s in hand], reverse=True))
cnt, ranks = zip(*crs)
if ranks == (14, 5, 4, 3, 2):
ranks = (5, 4, 3, 2, 1)
s = straight(ranks)
f = flush(hand)
return (max(Rank_Table[cnt], s*4 + f*5), ranks)

def group(hand):
return sorted(set([(hand.count(x), x) for x in hand]), reverse=True)
def straight(ranks):
return len(set(ranks)) == 5 and (max(ranks) - min(ranks)) == 4
def flush(hand):
suits = [s for r, s in hand]
return len(set(suits)) == 1

def test():
nn = "2S 5H 7C 8D 9S".split()
p1 = "2S 2C 4H 5D 7C".split()
p2 = "2S 2C 4H 4D 7C".split()
k3 = "2S 2D 2C 4H 6S".split()
fl = "2S 4S 5S 7S 8S".split()
st = "2S 3D 4C 5D 6H".split()
k3p = "2S 2D 2C 3H 3S".split()
k4 = "2S 2D 2C 2H 6S".split()
sf = "2S 3S 4S 5S 6S".split()

hands = [nn, p1, p2, k3, fl, st, k3p, k4,sf]
print(poker(hands))
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python