Nomina la Brag Hand


11

sfondo

Brag è un gioco di carte simile nel concetto, ma più semplice del poker. Una mano in vanto è composta da tre carte ed è classificata come segue dal più alto al più basso:

  • Tris: tutte e tre le carte dello stesso valore. Chiamato come "tre re" ecc.

  • Esecuzione a filo o scala reale. Tutte e tre le carte dello stesso seme e di valori consecutivi. La mano prende il nome dalle tre carte in ordine crescente seguite dalle parole "sul rimbalzo" per distinguere da una semplice scala / scala, ad esempio "dieci-jack-regina sul rimbalzo". Nota che un asso è alto o basso ma non entrambi - "king-ace-two" non è una corsa.

  • Corri anche dritto. Come sopra ma senza l'obbligo di abbinare semi. Chiamato semplicemente come ad esempio "ten-jack-queen".

  • Colore: tutte e tre le carte dello stesso seme, che prende il nome dal valore più alto, ad es. "Ace flush".

  • Coppia: due carte dello stesso valore insieme a un terzo di un altro rango di versione. Chiamato come "coppia di tre" ecc.

  • Qualsiasi altra combinazione, che prende il nome dal rango più alto, ad es. "Asso alto".

Sfida

Dato tre carte da gioco, genera il nome della mano di vantarsi che hanno prodotto.

Le carte verranno inserite come tre stringhe di 2 caratteri o concatenate come una singola stringa di 6 caratteri (a seconda di quale sia la tua implementazione preferenziale), dove la prima di ogni coppia è il rango (2 ... 9, T, J, Q, K, A) e il secondo indica il seme (H, C, D, S).

Si applicano le regole del golf standard: scrivi un programma o una funzione che accetta questo input e genera il nome della mano come descritto sopra.

Puoi presumere che l'input sarà valido (gradi e semi nell'intervallo sopra, nessuna carta ripetuta) e in ogni caso preferisci, ma non sarà in alcun ordine particolare.

L'output deve essere in tutte le maiuscole, minuscole o maiuscole, ad esempio maiuscole o minuscole. I ranghi numerici dovrebbero essere indicati ad es. "Decine" e non 10s.

Ingressi e uscite di esempio:

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"

Questo è il mio primo tentativo di una sfida su questo sito, ti preghiamo di suggerire miglioramenti ma sii gentile :)



4
Benvenuti in PPCG! Finora ho sfiorato la sfida, ma sembra decente per la prima sfida. Detto questo, scrivere buone sfide è difficile e per il futuro consiglierei di pubblicare idee nella sandbox in primo luogo in cui è possibile ottenere feedback e migliorare i dettagli delle specifiche prima di rischiare downvotes, chiudere voti e risposte che potrebbero essere invalidate da successive modifiche al sfida.
Martin Ender,

@MartinEnder grazie! La prossima volta darò sicuramente un'occhiata alla sandbox.
IanF1

Possiamo ricevere input come matrici di tuple? Inoltre, possiamo abbreviare l'output come 'king flush' in 'fk'?
Matthew Roh,

1
si prega di aggiungere "6D6C6S"come caso di prova poiché sei è uno strano plurale
Non che Charles

Risposte:


2

Rubino, 384 , 320

Accetta una matrice di stringhe a due caratteri.

Traduce i valori di pip in valori esadecimali e identifica le mani in base a quanti valori di pip distinti ci sono.

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

commentata:

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

3

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

* ora passa i "sei" * grazie a Ben Frankel per aver salvato 46 byte!


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

Provalo online!

Grazie per la prima bella sfida!


1
Alcuni suggerimenti per giocare a golf negli spazi bianchi: TIO
drogato di matematica

Grazie! Sapevo che lo spazio bianco stava aggiungendo molti byte ma pensavo che richiedessero 4 spazi. Modificato! @math_junkie
Stephen

@ user7686415 Oppure puoi usare le schede effettive.
mbomb007,

1
@NotthatCharles risolto!
Stephen

1
@Stephen, certo. D.get(a, b)significa accedere al valore nel dict D nella chiave a, con valore predefinito b se la chiave non viene trovata. È lo stesso della scrittura D[a] if a in D else b, che è lo stesso della scrittura D[a] if a in D.keys() else b.
Ben Frankel,

2

PHP, 413 405 398 409 408 406 398 byte

Sfortunatamente, PHP non supporta l'array nidificato che fa riferimento all'interno delle stringhe;
ciò avrebbe salvato altri 6 5 byte.

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;

Esegui echo <hand> | php -nR '<code>o testalo online .

abbattersi

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
;

Richiede PHP> = 5.6 (per e[...])


1
questo potrebbe fallire "sixes"
Non che Charles

1
@NotthatCharles: Mi è costato 11 byte ... ma li ho recuperati. :)
Tito

1

Python 2 - 583 byte

Sono troppo nuovo per poter commentare i post, quindi pubblico la mia versione di Python Solusion.

Risolto il problema con 'es' per coppia e tre di sei. Grazie a non quel 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

Un po 'più leggibile con alcuni commenti

# 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

Inoltre può cambiare nelle ultime righe j=0; if [z]*3==v:r="three %ss"%i(z)in if [z]*3==v:r="three %ss"%d[z][0]Ma salva solo 1 byte
Dead Possum

1
questo potrebbe fallire "sixes"
Non che Charles

1
@NotthatCharles Sì, grazie per averlo notato. Ho aggiunto correzione
Dead Possum
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.