포커 핸드 이름


22

포커 핸드 이름

5 장의 카드가 주어지면 포커 핸드의 이름을 출력하십시오.

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 또는 commandline 인수 중 5 . 카드는 양식에있는 두 글자 문자열 RS이며 여기서 R은 순위이고 S는 적합합니다. 계급이 있다 2- 9(숫자 카드), T(열), J(잭), Q(여왕), K(임금), A(에이스). 정장 입니다 S, D, H, C각각 스페이드, 다이아몬드, 마음과 클럽.

카드의 예

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 에는 애매하게 관련된 oldie가 있습니다.
dmckee

원하는대로 손 이름을 대문자로 표기 할 수 있습니까?
Mr.Wizard

위자드 씨
daniero

답변:


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$+](=

나는 자본화를 조정할 수있는 자유를 이용하고 있습니다. 스트레이트 플러시와 로얄 플러시는 간단한 플러시에서 단어를 재사용하기 위해 플러시를 대문자로 사용합니다.

참고 : 일부 이전 버전은 버그가 많았습니다. 쌍이 왕실보다 가치가 낮을 때만 풀 하우스를 지원했습니다. 그들은 분리 공간 대체함으로써 보정 될 수 - 0로모그래퍼를 $.

데모


이제 골프 프로그램입니다! 나는 그것을 줄이는 방법을 찾고 있었지만 아무것도 만들 수 없습니다. .&문자열에서 고유 한 문자를 찾는 데 사용 하는 것은 매우 유용한 트릭입니다.
Cristian Lupascu

@ 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한 쌍을 두 쌍에서 분리하고 세 가지를 집에서 분리하기 위해 수행됩니다 .

편집 : 총 20 문자를 저장해 주셔서 감사합니다 Nolen Royality!


1
... 그리고 내 이길.
Mr.Wizard

새로운 해결책을 사랑하십시오, 312자는 아주 작습니다. 하나 대 두 쌍을 다루는 매우 영리한 방법 : D
Nolen Royalty

감사합니다 :) 당신이 원하는 경우에 그것을 시도 환영합니다. 그러나 광산 m 및 n과 유사한 변수를 사용하지 않을 수도 있습니다. 이것을 확인하고 코드를 다시 보면서, 나는 원래의
것에서

1
로 전환 m,n=g([c.count(x)for x in set(r)])하여 다른 8 자를 잃을 수 는 m,n=g(map(c.count,set(r)))없습니까?
Nolen Royalty

Woah, 당신은 내가 할 수있는 옳은 일입니다. 잘 잡아라, 고마워!
daniero

5

루비 1.9 (427 359 348 338 296 292)

편집 : 낮은 에이스로 작동하도록 수정되었습니다.

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);}

명령 줄에서 카드를 인수로 사용하여 실행합니다 (예 : 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

둘 다 좋은 솔루션입니다. 문자 수를 위해, 나는 "Pair"라는 이름이 "One Pair"라는 이름이되어야한다고 생각합니다. 비록 그것이 나쁘게 들리지만 다른 사람들이 구현 한 것이기 때문입니다.
daniero

@Daniero 감사합니다. 이름을 고칠 게요.
Mr.Wizard

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"

편집 : 에이스 로우 스트레이트에 1 문자 추가


3

파이썬 (334) , (326 개) 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 개의 문자를 저장할 수 있습니다 .
Cristian Lupascu

그것은 또한 작동합니다"Straight"
Cristian Lupascu

@ w0lf 감사합니다. 코드에 제안을 추가했습니다.
Howard

스트레이트를 감지하는 데 미묘한 버그 AH KH 2C 3H 4H가 있다고 생각합니다. 스트레이트로 간주되지만 하이 카드 여야합니다.
Cristian Lupascu

@ w0lf 흠, 나는 그것에 대해 생각해야합니다 ...
Howard

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 : {카드, 스위트}

디:


멋지지만 어떻게 두 쌍을 얻 JH 4C 2C JD TH습니까?
daniero

당신이 올바른지. 일부 구성 요소를 순수한 기능으로 결합했을 때 발생하는 오류가 있습니다. 추적하겠습니다.
DavidC

@Daniero 제기 한 문제가 해결되었습니다.
DavidC

데이비드, 이것을 압축 할 공간이 많이 있습니다. 나는 할 수있다?
Mr.Wizard

@ Mr.Wizard 내 손님이 되십시오. 보고 배우겠습니다.
DavidC
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.