一道经典试题的Python实现

来源:互联网 发布:频繁项集 知乎 编辑:程序博客网 时间:2024/06/14 20:14

一手牌是五张,根据牌的花色和分值得出这一手的分值,分值最高的那一手牌就是一局的赢家。
一手牌的类型和分值级别如下:
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)) == 4def flush(hand):    suits = [s for r, s in hand]    return len(set(suits)) == 1def 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))
0 0
原创粉丝点击