一道经典试题的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))
- 一道经典试题的Python实现
- 一道经典的面试题
- 一道表达式的经典试题
- 一道表达式的经典试题
- 一道经典面试题“I love china”的实现
- 一道经典面试题“I love china”的实现
- 一道经典面试题“I love china”的实现
- 一道经典面试题,atoi函数的实现
- 一道经典面试题“I love china”的实现
- 华为的一道经典面试题详解
- 一道经典的JAVA面试题
- 一道经典的java面试题分析
- 关于索引的一道经典面试题
- 关于fork()的一道经典面试题
- 一道经典的sql面试题
- 一道很经典的多线程面试题
- 一道面试题的实现
- LeetCode上一道经典的面试题-O(1)实现LRU Cache
- CSS(6)布局初步
- ViewController dealloc 不执行
- 对页端开发高性能(交互/动画) Mobile WebApp 的一些思考
- 分布式锁实现方式三 基干Memcache mutex设计模式
- 获取数据库增量数据的几种方式
- 一道经典试题的Python实现
- 线性表链式存储_测试框架搭建
- java 泛型中的上界(extend)和下界(super)
- 怎么提高ArcSDE for Oracle写入地理数据库的效率
- Linux epoll模型
- 卡片式弹出窗口
- android实现App新手引导功能
- OSINT + Python = 自定义黑客
- 微信小程序开发--逻辑层