Nennen Sie die Pokerhand

22

Nennen Sie die Pokerhand

Geben Sie bei fünf Karten den Namen der Pokerhand aus, die eine der folgenden sein wird:

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

Im Zweifelsfall lesen Sie die Regeln unter http://en.wikipedia.org/wiki/List_of_poker_hands .

Eingang

5 Karten mit Standard- oder Befehlszeilenargumenten. Eine Karte ist eine aus zwei Buchstaben bestehende Zeichenfolge auf dem Formular RS, wobei R für Rang und S für Farbe steht. Die Ränge sind 2- 9(Zahlenkarten), T(zehn), J(Bube), Q(Dame), K(König), A(Ass). Die Anzüge sind S, D, H, Cfür Pik, Karo, Herz und Clubs sind.

Beispiel von Karten

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

Eingabebeispiel => gewünschte Ausgabe

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

Regeln

Kürzester Code gewinnt

Bearbeiten

Sieht soweit super aus! Ich kann nicht wirklich alle Antworten überprüfen, da ich diese Sprachen nicht sehr gut kenne und keine Compiler / Interpreter für alle von ihnen habe, aber ich vermute, dass nicht jeder darüber nachgedacht hat, dass Asse sowohl die höchsten als auch die besten sein können die niedrigsten Karten einer Straße (Flush) .

daniero
quelle
2
Es gibt einen vage verwandten Oldie bei Stack Overflow .
Dmckee
Dürfen wir Handnamen nach Belieben großschreiben (oder nicht)?
Mr.Wizard
Mr.Wizard, sicher.
Daniero

Antworten:

3

GolfScript ( 209 208 207 206 200 199 197 196 Zeichen)

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

Ich nutze die angebotene Freiheit, um die Großschreibung zu optimieren: Mein Straight Flush und mein Royal Flush aktivieren beide Flush, um das Wort aus dem einfachen Flush wiederzuverwenden.

Hinweis: Einige frühere Versionen waren fehlerhaft: Sie unterstützten Full House nur, wenn das Paar einen niedrigeren Wert hatte als das Paar Royal. Sie können korrigiert werden, indem der Trennungsraum - 0durch a ersetzt wird $.

Demo

Peter Taylor
quelle
Nun, das ist ein Golfprogramm! Ich habe nach Möglichkeiten gesucht, es zu verkürzen, kann mir aber nichts einfallen lassen. Das .&Finden der verschiedenen Zeichen in einer Zeichenfolge ist ein sehr nützlicher Trick.
Cristian Lupascu
@w0lf, das ist ein ziemlich normaler Trick. Howard verwendet es auch in seiner Lösung.
Peter Taylor
8

Kam mit einer Antwort von mir selbst :)

Python - 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]

Erstellt eine 2x2-Liste, in der die Indizes der beiden Dimensionen boolesche Prüfungen für Flush und Straight sind. In beiden Fällen prüfen wir, ob es sich um einen Royal Flush oder nur um einen Straight Flush handelt. Für nicht Flush und nicht Straight prüfen wir die anderen Hände: mund nhalten die höchste und zweithöchste Anzahl gleichrangiger Karten; Die Namen der Zeiger werden in einer Liste mit Indizes nach gespeichert m. Unterprüfungen innerhalb der Werte dieser Liste werden durchgeführt, num ein Paar von zwei Paaren und drei Gleiche von Haus zu trennen.

Bearbeiten: Danke Nolen Royality für insgesamt 20 Zeichen gespeichert!

daniero
quelle
1
... und meine schlagen.
Mr.Wizard
Liebe die neue Lösung, 312 Zeichen sind ziemlich winzig. Sehr clevere Methode, mit einem gegen zwei Paare umzugehen: D
Nolen Royalty
Danke :) Du kannst es gerne ausprobieren, wenn du willst. Aber vielleicht verwenden Sie keine ähnliche Variable wie m und n. Als ich dies
überprüfte
1
Könnten Sie nicht durch Umschalten weitere 8 Zeichen verlieren m,n=g([c.count(x)for x in set(r)])an m,n=g(map(c.count,set(r)))?
Nolen Royalty
Woah, Sie haben verdammt recht, ich könnte: D Ich weiß nicht, warum mir das durch den Kopf ging. Guter Fang, danke!
Daniero
5

Ruby 1.9 (427 359 348 338 296 292)

BEARBEITEN : Problem behoben, bei dem mit niedrigen Assen gearbeitet wurde.

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]

Die Grundidee besteht darin, ein Array der Kartenmenge in jedem Rang aufzubauen, die Ziffern zu einer Zeichenfolge zu verknüpfen und dann reguläre Ausdrücke auszuführen, um festzustellen, welche Handform passt. Wir zählen die Anzahl der verschiedenen Farben, um festzustellen, ob sie mit den verschiedenen Farben (Flush, Straight Flush, Royal Flush) oder mit den anderen Farben (alles andere) verglichen werden sollen.

Nimmt die Karten wie folgt als separate Befehlszeilenargumente:

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

C 454 Zeichen

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

Führen Sie die Befehlszeile mit Karten als Argumenten aus, z. B. ./a.out 8C 3H 8S 8H 3S

Erweiterte Version mit Kommentaren:

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

Bearbeitungen:

  1. Durch Kombinieren und Wiederverwenden von Loops wurden 12 Zeichen gespart.
  2. Durch Inlining-String-Konstante 9 Zeichen gespart.
  3. 19 Zeichen durch Verwendung der Stringifizierung in Makro gespeichert, böse ..
Baby-Kaninchen
quelle
3

Mathematica , 365

Hier ist meine Sichtweise auf die Antwort von David Carraher.

Zur besseren Lesbarkeit mit Leerzeichen dargestellt.

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"]
  ]
] &

Einzeilige Version:

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"]]]&
Mr.Wizard
quelle
Nett. Sie haben sogar Speicherplatz für die Mustererkennung gefunden. ZB _anstelle von{_,_,_,_}
DavidC
Schöne Lösungen, ihr beide. Aus Gründen der Anzahl der Zeichen denke ich, dass das "Paar" "Ein Paar" heißen sollte, auch wenn es sich ein bisschen schlecht anhört, da dies von mir gepostet und von anderen implementiert wurde.
Daniero
@ Daniero Danke. Ich werde den Namen reparieren.
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"

Bearbeiten: Es wurde 1 Buchstabe für Geraden mit niedrigem Ass hinzugefügt

tmartin
quelle
3

Python 334 , 326 322 Zeichen

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]]

Ich weiß, dass der letzte Liner ziemlich unleserlich wird. Ich werde eine Version ohne Golf spielen, wenn ich mit meiner Lösung zufrieden bin.

Nolen Royalty
quelle
2

GolfScript, 258 250 Zeichen

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])\;

Das Programm erwartet die Eingabe auf STDIN wie oben angegeben und gibt sie auf STDOUT aus. Sie können den Code selbst testen .

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

> 8C 7H 6S TH 9S
Straight

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

Edit: Vorschläge von w0lf übernommen.

Howard
quelle
Schöne lösung! Sie können 3 Zeichen sparen, indem Sie " of a kind"eine Variable eingeben , da diese zweimal verwendet wird.
Cristian Lupascu
es funktioniert auch mit"Straight"
Cristian Lupascu
@w0lf Danke. Ich habe dem Code Ihre Vorschläge hinzugefügt.
Howard
Ich denke, es gibt einen subtilen Fehler bei der Erkennung von Geraden: AH KH 2C 3H 4HWird als Straight angesehen, sollte aber High-Karte sein.
Cristian Lupascu
@ w0lf Hmmm, ich muss darüber nachdenken ...
Howard
2

Mathematica - 500 494 465 Zeichen

Diese Lösung basiert auf einer Poker-Demonstration von Ed Pegg, Jr. In dieser Version werden die Karten intern als Zahlen in behandeltRange[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"]]]]

Beispieleingänge, Ausgänge:

Daten

Anmerkungen:

f: spülen

c: Karten (ohne Farbe)

s: gerade

t: {Karten, Suiten}

d:

DavidC
quelle
Schön, aber wie kriegt man zwei Paare raus JH 4C 2C JD TH?
Daniero
Du hast Recht. Es ist ein Fehler aufgetreten, als ich einige Komponenten zu einer reinen Funktion zusammengefügt habe. Ich werde es aufspüren.
DavidC
@ Daniero Das von Ihnen angesprochene Problem wurde behoben.
DavidC
David, es gibt viel Raum, um dies zu komprimieren. Darf ich?
Mr.Wizard
@ Mr.Wizard Sei mein Gast. Ich werde zuschauen und lernen.
DavidC