命名扑克手


22

命名扑克手

给定五张牌,输出扑克手的名称,该名称为以下之一:

High card
One pair
Two pair
Three of a kind
Straight
Flush
Full house
Four of a kind
Straight flush
Royal Flush

如有疑问,请参阅http://en.wikipedia.org/wiki/List_of_poker_hands上的规则。

输入项

来自stdin或命令行参数的5 张卡片。卡片是表格上的两个字母的字符串RS,其中R是等级,S是西装。该队伍2- 9(号卡), T(十个),J杰克(Jack),(Q皇后), K(王),A(ACE)。该套装SDHC为黑桃,方块,分别心和俱乐部。

卡示例

5H - five of hearts
TS - ten of spades
AD - ace of diamonds

输入示例=>所需输出

3H 5D JS 3C 7C => One pair
JH 4C 2C JD 2H => Two pair
7H 3S 7S 7D 7C => Four of a kind
8C 3H 8S 8H 3S => Full house

规则

最短的代码胜出

编辑

到目前为止看起来很棒!我无法真正验证所有答案,因为我不太了解这些语言,也没有针对所有语言的编译器/解释器,但我怀疑并非所有人都认为Aces既可以是最高语言,又可以是最高语言。直牌(同花)的最低牌


2
关于Stack Overflow有一个模糊的相关老歌
dmckee 2012年

我们是否可以随意大写(或不使用)手名?
威兹德先生2012年

向导先生,当然。
daniero 2012年

Answers:


3

GolfScript(209 208 207 206 200 199 197 196个字符)

3/zip:^0={10,''*"TJQKA"+?}/]:?15,{?\{=}+,,}%2,-$6,14.),++@$/):|;[!!2*^1=.&,(!+5+]or{/}*'Full house
Two pair
One pair
ThreeKFourKHigh card
Flush
Straight''K'/' of a kind
'*n/~|1$"Royal"if" "+2$+](=

我正在利用提供的自由来调整大小写:我的Straight Flush和Royal Flush都大写了Flush,以便重用简单的同花顺中的单词。

注意:某些较早的版本存在错误:它们仅在配对价格低于皇家配对时才支持满员。他们可以通过更换空格分开矫正- 0$

演示版


现在这是一个高尔夫球程序!我一直在寻找缩短它的方法,但是什么也没想出来。使用.&查找字符串中的不同字符是一个非常有用的技巧。
克里斯蒂安·卢帕斯库

@ w0lf,这是一个相当标准的技巧。霍华德在解决方案中也使用了它。
彼得·泰勒

8

想到了我自己的答案:)

蟒- 312 301 298

R,K,F,S,g=' 23456789TJQKA2345A',' of a Kind','Flush','Straight ',sorted
s,r=''.join(g(raw_input(),key=R.find)).split()
n,m=g(map(r.count,set(r)))[-2:]
print[[F,[0,'High Card','TOwnoe'[n&1::2]+' Pair',['Full House','Three'+K][n&1],'Four'+K][m]],[[S,'Royal '][r[0]=='T']+F,S]][r in R][len(set(s))>1]

创建一个2x2列表,其中两个维度的索引是对齐平和直线的布尔检查。对于这两种情况,我们都会检查是同花顺还是同花顺。对于不齐平和不直的情况,我们检查另一手牌:mn持有同等级卡片中最高和第二高的数量;手的名字被存储在带有根据的索引的列表中m。在此列表的值中进行子检查是为了n将一对从两对中分离出来,将其中的三对从房屋中分离出来。

编辑:感谢Nolen Royality总共保存了20个字符!


1
...击败我。
威兹德先生2012年

喜欢这个新解决方案,它的312个字符很小。非常聪明的方法来处理一对一对:D
Nolen Royalty

谢谢:)欢迎您尝试。但是您可能没有使用与m和n类似的变量。检查一下并再次查看您的代码,我才意识到我可以在原始版本中节省更多^^
daniero 2012年

1
切换m,n=g([c.count(x)for x in set(r)])到,您还能再输8个字符m,n=g(map(c.count,set(r)))吗?
Nolen Royalty

哇,你该死的对,我可以:D不知道为什么这会打扰我。很好,谢谢!
daniero 2012年

5

Ruby 1.9(427 359 348 338 296 292)

编辑:固定为低ace工作。

o,p=%w(flush straight)
f=/1{5}|1{4}0+1$/
s=[0]*13
puts Hash[*$*.map{|c|s['23456789TJQKA'.index c[0]]+=1;c[1]}.uniq[1]?[f,p,?4,'four'+a=' of a kind',/3.*2|2.*3/,'full house',?3,'three'+a,/2.*2/,'two pair',?2,'one pair',0,'high card']:[/1{5}$/,'royal '+o,f,p+' '+o,0,o]].find{|r,y|s.join[r]}[1]

基本思想是在每个等级中建立一张纸牌数量的数组,将数字连接成一个字符串,然后运行正则表达式以查看哪种手形适合。我们计算不同套装的数量,以确定是否根据不同的同花顺(同花顺,同花顺,皇家同花顺)或其他形状(除其他以外)进行检查。

将卡作为单独的命令行参数,如下所示:

>ruby poker-hand-golf.rb 3H 5D JS 3C 7C
one pair

4

C,454个字符

#define L for(a=1;a<6;a++)for(b=0;b<13;b++)
#define U u[b+6]
#define R(x,y) if(x)puts(#y);else
b,f,r,h=0,s=0,u[20]={0};main(int a,char**v){L U+=v[a][0]=="23456789TJQKA"[b];f=v[1][1];L{if(v[a][1]!=f)f=0;u[a]+=a==U;if(b>7)h+=U;if(a*13+b<64||!U)r=0;else if(++r==5)s=1;}R(f&&h==25,Royal flush)R(f&&s,Straight flush)R(u[4],Four of a kind)R(u[3]&&u[2],Full house)R(f,Flush)R(s,Straight)R(u[3],Three of a kind)R(u[2]==2,Two pair)R(u[2],One pair)R(h,High card);}

从命令行以卡作为参数运行,例如./a.out 8C 3H 8S 8H 3S

扩展版本,带有注释:

#define L for(a=1;a<6;a++)for(b=0;b<13;b++)
#define R(x,y) if(x)puts(#y);else
#define U u[b+6]
b,f,r,h=0,s=0,u[20]={0};
main(int a,char**v){
    // card usage - u[6..]
    L U+=v[a][0]=="23456789TJQKA"[b];
    // NOTE: lets expand the inner body of the loop in the answer so this looks more sane:
    // flush
    f=v[1][1];L if(v[a][1]!=f)f=0;
    // count of usages - u[0..5] 
    L u[a]+=a==U;
    // high cards x5
    L if(b>7)h+=U;
    // straights
    L if(a*13+b<64||!U)r=0;else if(++r==5)s=1;        
    // display
    R(f&&h==25,Royal flush)
    R(f&&s,Straight flush)
    R(u[4],Four of a kind)
    R(u[3]&&u[2],Full house)
    R(f,Flush)
    R(s,Straight)
    R(u[3],Three of a kind)
    R(u[2]==2,Two pair)
    R(u[2],One pair)
    R(h,High card);    
}

编辑:

  1. 通过组合和重用循环节省了12个字符。
  2. 通过内联字符串常量节省了9个字符。
  3. 通过在宏中使用字符串化节省了19个字符,令人讨厌。

3

数学 365

这是我对David Carraher的回答的看法。

以空格显示以提高可读性。

If[
  a = Characters;
  x = Thread;
  r = Range;
  d = Sort[a@StringSplit@# /. x[a@"23456789TJQKA" -> 2~r~14]];
  {t, u} = Sort[Last /@ Tally@#] & /@ x@d;
  c = First /@ d;
  f = u == {5};
  S = "Straight";
  c == r[b = d[[1, 1]], b + 4],
  If[f,
   If[c == 10~r~14, "Royal Flush", S <> " flush"], S],
  If[f, "Flush",
   Switch[t,
    {_, 4},    "Four of a kind",
    {2, 3},    "Full house",
    {__, 3},   "Three of a kind",
    {_, 2, 2}, "Two pair",
    {__, 2},   "One pair",
    _,         "High card"]
  ]
] &

一线版本:

If[a=Characters;x=Thread;r=Range;d=Sort[a@StringSplit@#/.x[a@"23456789TJQKA"->2~r~14]];{t,u}=Sort[Last/@Tally@#]&/@x@d;c=First/@d;f=u=={5};S="Straight";c==r[b=d[[1,1]],b+4],If[f,If[c==10~r~14,"Royal Flush",S<>" flush"],S],If[f,"Flush",Switch[t,{_,4},"Four of a kind",{2,3},"Full house",{__,3},"Three of a kind",{_,2,2},"Two pair",{__,2},"One pair",_,"High card"]]]&

真好 您甚至找到了可以在模式匹配中节省的空间。例如,_代替{_,_,_,_}
DavidC

你们两个都很好的解决方案。为了便于计算字符,我认为“对”应该命名为“一对”,尽管听起来有点不好,因为这是我发布的内容,其他人也已经实现了。
daniero

@Daniero谢谢。我会改名字。
威兹德先生2012年

3

K,294 295

d:{F:"Flush";S:"Straight ";P:" Pair";K:" of a kind";$[(f:1=#?,/-1#'c)&("AJKQT")~a@<a:,/j:1#'c:" "\:x;"Royal ",F;f&s:(4#1)~1_-':a@<a:,/(("A23456789TJQKA")!1+!14)@j;S,F;4=p:|/#:'=j;"Four",K;(2;3)~u:a@<a:,/#:'=j;"Full House";f;F;s;S;3=p;"Three",K;(1;2;2)~u;"Two",P;(1;1;1;2)~u;"One",P;"High Card"]}

k)d'("TS JS QS KS AS";"3S 4S 5S 7S 6S";"JC JH KS JD JS";"JC JH 2S JD 2C";"2C 9C TC QC 6C";"8C 5D 9H 6C 7D";"8C 8D 9H 8S 7D";"8C 8D 9H 2S 9D";"8C 8D 4H 2S 9D";"3C 8D 4H 2S 9D")
"Royal Flush"
"Straight Flush"
"Four of a kind"
"Full House"
"Flush"
"Straight "
"Three of a kind"
"Two Pair"
"One Pair"
"High Card"

编辑:为低位A顺子添加了1个字符


3

Python的334326个 322字符

p,f,l,t,o=" pair"," of a kind"," Flush","Straight","A23456789TJQK"
v,u=zip(*raw_input().split())
s=''.join(sorted(v,key=o.find))
print{5:"High card",7:"One"+p,9:"Two"+p,11:"Three"+f,13:"Full house",17:"Four"+f,23:t,24:l[1:],25:t,42:t+l,44:"Royal"+l}[(sum(map(v.count,v)),24)[len(set(u))<2]+((0,20)[s=="ATJQK"],18)[s in o]]

我知道最后一个衬纸变得非常难以理解,当我对解决方案感到满意时,我会提出一个非高尔夫球版。


2

GolfScript,258 250个字符

3/zip~;.&,(!\{"23456789TJQKA"?}%$.(\{.@- 8%}%\;"\1"-!\.1/.&{1$\-,}%1.$?)"Four"" of a kind":k+{.,2="Full house"{.2\?)"Three"k+{.3-,({.3\?)"One pair"{;"Straight":?;2$2$&{(8="Royal"?if" flush"+}{;?{"Flush""High card"if}if}if}if}"Two pair"if}if}if}if])\;

程序期望如上所述在STDIN上输入并输出到STDOUT。您可以自己测试代码

> 8C 3H 8S 8H 3S
Full house

> 8C 7H 6S TH 9S
Straight

> AH 3H 4S 2H 6S
High card

编辑:结合了w0lf的建议。


不错的解决方案!您可以通过" of a kind"输入一个变量来节省3个字符,因为该变量被使用了两次。
克里斯蒂安·卢帕斯库

它也可以与"Straight"
Cristian Lupascu 2012年

@ w0lf谢谢。我将您的建议添加到了代码中。
霍华德

我认为对Straights的检测存在一个细微的错误:AH KH 2C 3H 4H被认为是Straight,但应该是High卡。
克里斯蒂安·卢帕斯库

@ w0lf Hmmm,我得考虑一下...
霍华德

2

数学- 500 494 465个字符

此解决方案基于小埃德·佩格(Ed Pegg,Jr)的扑克演示。在此版本中,纸牌在内部被视为数字Range[2,14]

v[x_] := Block[{d, t, c, f, s},
 d = Sort@ToExpression[Characters[ImportString[x, "Table"][[1]]] /. {"T" -> 10, "J" -> 11, "Q" -> 12, "K" -> 13, "A" -> 14}];t = Sort /@ Map[Length, Split /@ Sort /@ Transpose@d, {2}];c = d[[All, 1]];f = (t[[2]] == {5});s = c == Range[b = d[[1, 1]], b + 4];
If[s,
 If[f, If[c == 10~Range~14, "royal flush", "straight flush"],"straight"],
 If[ f, "flush",
Switch[t[[1]],
 {1, 4}, "four of a kind",
 {2, 3}, "full house",
 {1, 1, 3}, "three of a kind",
 {1, 2, 2}, "two pair",
 {1, 1, 1, 2}, "one pair",
 {1, 1, 1, 1, 1}, "high card"]]]]

样本输入,输出:

数据

笔记:

f:齐平

c:卡片(无西装)

s:直

t:{卡,套房}

d:


很好,但是您如何得到两双JH 4C 2C JD TH呢?
daniero 2012年

你是对的。当我将某些组件连接到一个纯函数中时,会出现一个错误。我会追踪它。
DavidC 2012年

@Daniero您提出的问题已解决。
DavidC 2012年

大卫,还有很多压缩空间。我可以?
Wizard先生2012年

@Wizard先生成为我的客人。我会观看和学习。
DavidC
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.