Nennen Sie die Prahlerhand

11

Hintergrund

Brag ist ein Kartenspiel, dessen Konzept dem von Poker ähnelt, das jedoch einfacher ist. Eine Hand in Prahlerei besteht aus drei Karten und wird vom höchsten zum niedrigsten wie folgt eingestuft:

  • Dreier - alle drei Karten haben den gleichen Rang. Benannt als "drei Könige" usw.

  • Running Flush aka Straight Flush. Alle drei Karten der gleichen Farbe und aufeinanderfolgender Ränge. Die Hand wird durch die drei Karten in aufsteigender Reihenfolge benannt, gefolgt von den Worten "auf dem Sprung", um sich von einem einfachen Lauf / Straight zu unterscheiden, z. B. "Ten-Jack-Queen auf dem Sprung". Beachten Sie, dass ein Ass entweder hoch oder niedrig ist, aber nicht beides - "König-Ass-Zwei" ist kein Lauf.

  • Laufen Sie aka gerade. Wie oben, jedoch ohne passende Anzüge. Einfach benannt als zB "Ten-Jack-Queen".

  • Flush - alle drei Karten haben dieselbe Farbe, benannt nach dem höchsten Rang, z. B. "Ace Flush".

  • Paar - zwei Karten des gleichen Ranges zusammen mit einem Drittel eines anderen Versionsrangs. Benannt als "Dreierpaar" usw.

  • Jede andere Kombination, benannt nach dem höchsten Rang, zB "Ass hoch".

Herausforderung

Geben Sie bei drei Spielkarten den Namen der Prahlerei aus, die sie ausgeben.

Die Karten werden entweder als drei 2-stellige Zeichenfolgen eingegeben oder als einzelne 6-stellige Zeichenfolge verkettet (je nachdem, was Ihre Implementierung bevorzugt), wobei der erste jedes Paares der Rang ist (2 ... 9, T, J, Q, K, A) und die zweite bezeichnet die Farbe (H, C, D, S).

Es gelten die Standardregeln für das Golfen - schreiben Sie ein Programm oder eine Funktion, die diese Eingabe akzeptiert und den Namen der Hand wie oben beschrieben ausgibt.

Sie können davon ausgehen, dass die Eingabe gültig ist (Ränge und Farben im oben genannten Bereich, keine wiederholte Karte) und in jedem Fall, den Sie bevorzugen, jedoch nicht in einer bestimmten Reihenfolge.

Die Ausgabe muss entweder in Großbuchstaben, in Kleinbuchstaben oder in einer sinnvollen Groß- und Kleinschreibung erfolgen, z. B. in Groß- oder Kleinschreibung. Numerische Ränge sollten z. B. "Zehner" und nicht Zehner geschrieben werden.

Beispiel Ein- und Ausgänge:

2H3C2D => "pair of twos"

TD8C9C => "eight-nine-ten"

4SKS9S => "king flush"

4D4H4S => "three fours"

5H3H2C => "five high"

2D3DAD => "ace-two-three on the bounce"

6D6C6H => "three sixes"

Dies ist mein erster Versuch einer Herausforderung auf dieser Seite. Bitte schlagen Sie Verbesserungen vor, aber seien Sie vorsichtig :)

IanF1
quelle
3
Verbunden. Verbunden.
Martin Ender
4
Willkommen bei PPCG! Ich habe die Herausforderung bisher nur überflogen, aber für eine erste Herausforderung sieht es anständig aus. Trotzdem ist es schwierig, gute Herausforderungen zu schreiben, und für die Zukunft würde ich empfehlen, zuerst Ideen in der Sandbox zu veröffentlichen, wo Sie Feedback erhalten und Details der Spezifikation verbessern können, bevor Sie Abstimmungen, enge Abstimmungen und Antworten riskieren, die durch spätere Änderungen an der ungültig werden könnten Herausforderung.
Martin Ender
@ MartinEnder danke! Ich werde mir das nächste Mal sicherlich den Sandkasten angesehen haben.
IanF1
Können wir Eingaben als Arrays von Tupeln erhalten? Können wir auch die Ausgabe wie 'king flush' auf 'fk' kürzen?
Matthew Roh
1
Bitte fügen Sie "6D6C6S"als Testfall hinzu, da sechs ein ungerader Plural ist
nicht, dass Charles

Antworten:

2

Ruby, 384 , 320

Akzeptiert ein Array von Zeichenfolgen mit zwei Zeichen.

Übersetzt die Pip-Werte in Hex-Werte und identifiziert Hände anhand der Anzahl der unterschiedlichen Pip-Werte.

->*d{u=d.map{|x|*u=x[1]}==u*3
g=d.map{|x|(x[0].tr'TJQKA','ABCDE').hex}.sort
g=1,2,3if[2,3,14]==g
_,l,h=a=g.map{|x|%w{king queen jack ten nine eight seven six five four three two ace}[-x%13]}
[*g[0]..2+g[0]]==g ?a*?-+(u ?' on the bounce':''):u ?h+' flush':[h+' high','pair of '+l+=l[?x]?'es':?s,'three '+l][-g.uniq.size]}

Kommentiert:

->*d{
    # u is "Is this a flush?"" (see if you have more than one suit)
    u=d.map{|x|u=x[1]}==[u]*3

    # g is the sorted card values in integer (convert to base 16)
    g=d.map{|x|x[0].tr('TJQKA','ABCDE').hex}.sort

    # use Ace == 1 if we have a low straight
    g=[1,2,3]if[2,3,14]==g

    # a is the names of all the cards
    a=g.map{|x|%w{ace two three four five six seven eight nine ten jack queen king ace}[x-1]}

    # l is for "plural" - just choose the middle card because we
    #                     only care about plurals for 2s or 3s
    l=a[1].sub(?x,'xe')+?s

    # if [g[0],g[0]+1,g[0]+2] == g, we have a run
    # possibly "on the bounce"
    ([*g[0]..g[0]+2]==g) ? (a * ?-) + (u ? ' on the bounce' : '') :

    # if we have a flush, we can't have three-of-a-kind, so try that first
    u ? a[2]+' flush' :

    # otherwise, dedupe your hand. if there's: 
    # 3 values, x high; 2 values, pair; 1 value, three
    [a[2]+' high','pair of '+l,'three '+l][-g.uniq.size]
}
Nicht dass Charles
quelle
3

Python 2 , 788, 715, 559, 556, 554, 546, 568, 522 Bytes

* übergibt jetzt die 'Sechser' * danke an Ben Frankel für die Einsparung von 46 Bytes!


import re
d,m,n=dict(zip('JQKA',range(10,15))),'pair of %ss','%s-%s-%s'
C=lambda s:int(d.get(s[0],s[0]))
z,x,c=sorted(re.findall('..',raw_input()),key=C)
q,w,e=C(z),C(x),C(c)
A=[0,0,'two','three','four','five','six','seven','eight','nine','ten','jack','queen','king','ace']
I,O,U=A[e],A[w],A[q]
a,k='%s high'%I,e-w+q
if k==13:a=n%(I,U,O)
if k==w:a=n%(U,O,I)
if q==w or e==w or e==q:a=m%O
if k==e==w:a='three %ss'%I
if'x'in a:a=a[:-1]+'es'
if z[-1]==x[-1]==c[-1]:
 if'-'in a:a+=' on the bounce'
 else:a='%s flush'%I
print a

Probieren Sie es online aus!

Danke für eine coole erste Herausforderung!

Stephen
quelle
1
Einige Whitespace-Golfvorschläge: TIO
Mathe-Junkie
Vielen Dank! Ich wusste, dass der Leerraum viele Bytes hinzufügte, aber ich dachte, dass er 4 Leerzeichen benötigt. Bearbeitet! @math_junkie
Stephen
@ user7686415 Oder Sie können stattdessen tatsächliche Registerkarten verwenden.
mbomb007
1
@NotthatCharles hat es behoben!
Stephen
1
@ Stephen, sicher. D.get(a, b)bedeutet, auf den Wert im Diktat D bei Schlüssel a zuzugreifen, mit dem Standardwert b, wenn der Schlüssel nicht gefunden wird. Es ist dasselbe wie Schreiben D[a] if a in D else b, was dasselbe ist wie Schreiben D[a] if a in D.keys() else b.
Ben Frankel
2

PHP, 413 405 398 409 408 406 398 Bytes

Leider unterstützt PHP keine verschachtelten Array-Verweise innerhalb von Zeichenfolgen.
das hätte weitere 6 5 Bytes gespart .

for(;$a=$argn[$i++];)$i&1?$v[strpos(_3456789TJQKA,$a)]++:$c[$a]++;$k=array_keys($v);sort($k);$n=[two,three,four,five,six,seven,eight,nine,ten,jack,queen,king,ace];echo($m=max($v))<2?($k[!$d=count($c)]+2-($h=$k[2])?$k[1]>1|$h<12?"$n[$h] ".[flush,high][$d++/2]:"ace-two-three":$n[$k[0]]."-".$n[$k[1]]."-$n[$h]").[" on the bounce"][$d^1]:($m<3?"pair of ":"three ").$n[$v=array_flip($v)[$m]].e[$v^4].s;

Laufen Sie mit echo <hand> | php -nR '<code>oder testen Sie es online .

Nervenzusammenbruch

for(;$a=$argn[$i++];)$i&1?      # loop through input
    $v[strpos(_3456789TJQKA,$a)]++  # count values on even positions [0,2,4]
    :$c[$a]++;                      # count colors on odd positions [1,3,5]
$k=array_keys($v);sort($k);     # $k=ascending values
$n=[two,three,four,five,six,seven,eight,nine,ten,jack,queen,king,ace];
echo($m=max($v))<2              # three different values:
?($k[!$d=count($c)]+2-($h=$k[2])    # test normal straight ($d=color count, $h=high card)
    ?$k[1]>1|$h<12                      # test special straight
        ?"$n[$h] ".[flush,high][$d++/2]     # flush if one color, high card if not
                                            #   ($d++ to avoid " on the bounce")
        :"ace-two-three"                    # special straight
    :$n[$k[0]]."-".$n[$k[1]]."-$n[$h]"  # normal straight
).[" on the bounce"][$d^1]          # if straight: straight flush if one color
:($m<3?"pair of ":"three ")     # pair or triplet
    .$n[$v=array_flip($v)[$m]]      # card name
    .e[$v^4].s                      # plural suffix
;

Benötigt PHP> = 5.6 (für e[...])

Titus
quelle
1
Dies kann "Sixes" scheitern
Nicht, dass Charles
1
@NotthatCharles: Das hat mich 11 Bytes gekostet ... aber ich habe sie zurückgespielt. :)
Titus
1

Python 2 - 583 Bytes

Ich bin zu neu, um Beiträge kommentieren zu können, also poste ich einfach meine Version von Python Solusion.

Problem mit 'es' für Paar und drei von Sechsern behoben. Danke an Nicht diesen Charles

d={'A':['ace',14],'2':['two',2],'3':['three',3],'4':['four',4],'5':['five',5],'6':['six',6],'7':['seven',7],'8':['eight',8],'9':['nine',9],'T':['ten',10],'J':['jack',11],'Q':['queen',12],'K':['king',13]}
r=input()
j=1
i=lambda x:d[x][j]
v=sorted(r[::2],key=i)
z,y,x=v
s=r[1::2]
e='es'if i(y)==6else's'
j=0
a=i(x)
if z==y or y==x:r="pair of %s"%i(y)+e
if s[0]*3==s:r="%s flush"%a
t="%s-%s"%(i(z),i(y))
j=1
u=" on the bounce"if r[-1]=='h'else ""
if i(z)+i(x)==2*i(y):r=t+"-%s"%a+u
if ''.join(v)=="23A":r="%s-"%a+t+u
if [z]*3==v:r="three %s"%d[z][0]+e
if len(r)==6:r="%s high"%a
print r

Ein bisschen lesbarer mit einigen Kommentaren

# first of all we don't need to keep suits
d={'A':['ace',14],'2':['two',2],'3':['three',3],'4':['four',4],'5':['five',5],'6':['six',6],'7':['seven',7],'8':['eight',8],'9':['nine',9],'T':['ten',10],'J':['jack',11],'Q':['queen',12],'K':['king',13]}
r=input()                           # input placed in r, to safely check r[-1] later in code
j=1                                 # j toggles reading from dictionary: 0-string, 1-value
i=lambda x:d[x][j]                  # lambda used to access dictionary
v=sorted(r[::2],key=i)              # take values from input and sort
z,y,x=v                             # variables to compact code
s=r[1::2]                           # take suits from input
e='es'if i(y)==6else's'             # choose ending 'es' for six and 's' for others (for pair and three)
j=0                                 # toggle reading from dictionary to string
a=i(x)                              # get string of top most value
if z==y or y==x:                    # check only two pairs as values are sorted
    r="pair of %s"%i(y)+e
if s[0]*3==s:                       # compact check if all string characters are equal to detect flush
    r="%s flush"%a
t="%s-%s"%(i(z),i(y))               # part of straight output - first two values
j=1                                 # toggle reading from dictionary to values
u=" on the bounce"\                 # addon to output in case of possible straight flush
if r[-1]=='h'else ""                # detected by checking last character in r
                                    # which would be 'h' if flush was detected
if i(z)+i(x)==2*i(y):               # check straight - three sorted numbers a,b,c would be in line if a+c == 2*b
    r=t+"-%s"%a+u                   
if ''.join(v)=="23A":               # check special case with straight, started from Ace
    r="%s-"%a+t+u  
j=0                                 # toggle reading from dictionary to string
if [z]*3==v:                        # check three equal values (almost the same as flush check)
    r="three %s"%d[z][0]+e
if len(r)==6:                       # if r was never modified, then it's just one high card
    r="%s high"%a
print r                             # output r
Totes Opossum
quelle
Auch kann in den letzten Zeilen ändern j=0; if [z]*3==v:r="three %ss"%i(z)zu if [z]*3==v:r="three %ss"%d[z][0]Aber es spart nur 1 Byte
Toter Possum
1
Dies kann "Sixes" scheitern
Nicht, dass Charles
1
@NotthatCharles Ja, danke, dass du es bemerkt hast. Ich habe Fix hinzugefügt
Dead Possum