扑克牌从最好到最坏依次排列如下:
请注意,Ace,A可以是最高的,也可以是最低的(1或14)。
一张卡片可以用两个字母来识别:As (黑桃),Jc (千斤顶),7h (7个红桃)等等。
你从经销商那里得到四张卡片(四个输入字符串)。找到并输出你能得到的最好的最后一张卡片。
如果有同样好的卡片,那么你可以选择选择哪一张。
输入和输出格式是可选的,但是各个卡必须标识为上面所示的Jc和2h。
Ah Kh Jh 10h
Qh
7d 8h 10c Jd
9d (or 9h, 9c, 9s)
Js 6c 10s 8h
Jc (or Jh, Jd)
Ac 4c 5d 3d
2h (or 2d, 2c, 2s)
5s 9s Js As
Ks
2h 3h 4h 5h
6h
Js Jc Ac Ah
As (or Ad) <- Note that AAAJJ is better than AAJJJ because A is higher than J
10d 9d 5h 9c
9h (or 9s)
Ah Ac Ad As
Ks (or Kd, Kh, Kc)
4d 5h 8c Jd
Jc (or Js, Jh)这是代码高尔夫,所以最短的提交以字节为单位获胜。
发布于 2016-11-16 18:31:30
eo_S+*-5l@\AN}SPMJ+NZSM.:+\AT5+-4l{eMJlM.gPkJ-sM*=T+`M}2Tc4"JQKA""hscd"=Zc这太可怕了。解析卡片,排序值,.每件事都需要这么多的碳。但这个方法很有趣。
在线试用:游行示威或测试套房
我生成所有52张卡片,删除输入的四张卡片,为每一张卡片生成一个分数(手的分数),并以最大的分数打印卡片。
这个分数有点奇怪。如果我比较两只完全不同的手的得分,可能会选错胜利者。一根直线就能赢4张王牌。但是,如果前四张牌在两只手上都是一样的,那就行了。我的计算分数实际上不是一个值,而是一个值列表:
5h 5d 6c 5s Jd -> [3, 1, 1]Flush -> 3被追加,not flush -> 2/1/0被追加。0,如果为直A2345,则为4,如果为较高的直线,则为5。这些4-7个数字的列表按递减顺序排序,并选择最大值的列表。
为什么要这么做?在这里,您可以看到所有类型的可能配置。数字旁边的字母,告诉你这个数字是用哪条规则生成的。
[5S, 3F, 1G, 1G, 1G, 1G, 1G]或[4S, 3F, 1G, 1G, 1G, 1G, 1G][4G, 1G, 0F, 0S][3G, 2G, 1F, 0S]或[3G, 2G, 0F, 0S][3F, 1G, 1G, 1G, 1G, 1G, 0S][5S, 2F, 1G, 1G, 1G, 1G, 1G],[5S, 1F, 1G, 1G, 1G, 1G, 1G],[5S, 1G, 1G, 1G, 1G, 1G, 0F],[4S, 2F, 1G, 1G, 1G, 1G, 1G],[4S, 1F, 1G, 1G, 1G, 1G, 1G],[4S, 1G, 1G, 1G, 1G, 1G, 0F][3G, 1G, 1G, 1F, 0S],[3G, 1G, 1G, 0F, 0S][2G, 2G, 2F, 1G, 0S],[2G, 2G, 1F, 1G, 0S],[2G, 2G, 1G, 0F, 0S][2G, 2F, 1G, 1G, 1G, 0S],[2G, 1G, 1G, 1G, 1F, 0S],[2G, 1G, 1G, 1G, 0F, 0S][2F, 1G, 1G, 1G, 1G, 1G, 0S],[1F, 1G, 1G, 1G, 1G, 1G, 0S],[1G, 1G, 1G, 1G, 1G, 0S, 0F]Pyth将列表元素进行比较。所以很明显,一次直冲总能打败四次。大多数典型的扑克规则在这些列表中是显而易见的。有些似乎自相矛盾。
[2G, 2F, 1G, 1G, 1G, 0S]将赢下一些两双手。也没问题。如果你得到了两对河卡,比你至少有一对之前的河。但这意味着,你可以提高到三种类型,这是更好的。所以两对根本不可能是答案。[2F, 1G, 1G, 1G, 1G, 1G, 0S]将赢得一些一对手。如果这是你能达到的最好的分数,在河流之前,你将有3张卡的一个套房和一个不同的套房的一张卡。但是,您可以选择这两套套间中的一张,并且有一个已经出现的值,您将得到分数[2F, 2G, ...],这也更好。因此,这选择了正确的解决方案类型。但是我如何得到最好的一对(四种可能性),我如何选择最好的直,.?因为两种不同的一对解决方案可以有相同的分数。
这很简单。Pyth保证稳定排序(当取最大值时)。因此,我简单地按顺序2h 2s 2c 2d 3h 3s ... Ad生成卡片。因此,具有最高值的卡将自动成为最大值。
=Zc拆分输入字符串并将卡片列表存储在Z中。=T+`M}2Tc4"JQKA"生成等级['2', ..., '10', 'J', 'Q', 'K', 'A']的列表,并将它们存储在T中。-sM*T..."hscd"Z生成与套间的每一个等级组合,并移除Z卡。
o...按以下方式排序这些剩余的卡片:lM.gPkJ表示等级组的长度,+-4l{eMJlM附加4长(套间),+*-5l@\AN}SPMJ+NZSM.:+\AT5附加0/4/5取决于套件(生成"A"+T的长度5的每个子串,检查其中一只手(需要排序手并对所有子集进行排序),乘以5-牌中的"A"s ),_S排序列表减少。
e选择最大值并打印。
https://codegolf.stackexchange.com/questions/99962
复制相似问题