Nombra la mano presumida

11

Antecedentes

Brag es un juego de cartas similar en concepto a, pero más simple que el póker. Una mano alardeada consta de tres cartas y se clasifica de la siguiente manera de mayor a menor:

  • Tres de un tipo: las tres cartas del mismo rango Nombrado como "tres reyes", etc.

  • Ejecución de color también conocido como escalera de color. Las tres cartas del mismo palo y de filas consecutivas. La mano es nombrada por las tres cartas en orden ascendente seguidas de las palabras "en el rebote" para distinguir de una simple carrera / escalera, por ejemplo, "diez-jack-queen en el rebote". Tenga en cuenta que un as es alto o bajo, pero no ambos: "king-as-two" no es una carrera.

  • Corre alias derecho. Como arriba pero sin el requisito de combinar trajes. Llamado simplemente como, por ejemplo, "ten-jack-queen".

  • Flush - las tres cartas del mismo palo, nombradas por el rango más alto, por ejemplo, "Ace flush".

  • Par: dos cartas del mismo rango junto con un tercio del rango de otra versión. Nombrado como "par de tres", etc.

  • Cualquier otra combinación, nombrada por el rango más alto, por ejemplo, "as alto".

Desafío

Dadas tres cartas, muestra el nombre de la mano que presumen.

Las tarjetas se ingresarán como tres cadenas de 2 caracteres o se concatenarán como una sola cadena de 6 caracteres (lo que prefiera su implementación), donde el primero de cada par es el rango (2 ... 9, T, J, Q, K, A) y el segundo significa el palo (H, C, D, S).

Se aplican las reglas estándar de golf: escriba un programa o función que acepte esta entrada y genere el nombre de la mano como se detalla anteriormente.

Puede suponer que la entrada será válida (rangos y palos en el rango anterior, sin tarjeta repetida) y en cualquier caso que prefiera, pero no estará en ningún orden en particular.

La salida debe estar en mayúsculas, en minúsculas o en mayúsculas razonables, por ejemplo, el título o la oración. Los rangos numéricos se deben detallar, por ejemplo, "decenas" no 10s.

Muestra de entradas y salidas:

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"

Este es mi primer intento de desafío en este sitio, sugiera mejoras pero sea amable :)

IanF1
fuente
44
Bienvenido a PPCG! Hasta ahora solo he superado el desafío, pero parece decente para un primer desafío. Dicho esto, escribir buenos desafíos es difícil y para el futuro, recomendaría publicar ideas en el sandbox primero, donde puede obtener comentarios y mejorar los detalles de la especificación antes de arriesgar votos negativos, votos cerrados y respuestas que podrían ser invalidados por cambios posteriores en el desafío.
Martin Ender
@MartinEnder gracias! Sin duda, he echado un vistazo al sandbox la próxima vez.
IanF1
¿Podemos obtener entradas como matrices de tuplas? Además, ¿podemos acortar la salida como 'king flush' a 'fk'?
Matthew Roh
1
por favor agregue "6D6C6S"como un caso de prueba ya que seis es un plural impar
No es que Charles

Respuestas:

2

Rubí, 384 , 320

Acepta una serie de cadenas de dos caracteres.

Traduce los valores de pip en valores hexadecimales e identifica las manos en función de cuántos valores de pip distintos hay.

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

Anotado:

->*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]
}
No es que Charles
fuente
3

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

* ahora pasa los 'seis' * ¡gracias a Ben Frankel por salvar 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

Pruébalo en línea!

¡Gracias por un primer desafío genial!

Stephen
fuente
1
Algunas sugerencias de golf en espacios en blanco: TIO
math junkie
¡Gracias! Sabía que el espacio en blanco estaba agregando muchos bytes, pero pensé que requería 4 espacios. Editado! @math_junkie
Stephen
@ user7686415 O podría usar pestañas reales en su lugar.
mbomb007
1
@NotthatCharles lo arregló!
Stephen
1
@Stephen, claro. D.get(a, b)significa acceder al valor en el dict D en la clave a, con el valor predeterminado b si no se encuentra la clave. Es lo mismo que escribir D[a] if a in D else b, que es lo mismo que escribir D[a] if a in D.keys() else b.
Ben Frankel
2

PHP, 413 405 398 409 408 406 398 bytes

Desafortunadamente, PHP no admite referencias de matriz anidadas dentro de cadenas;
eso habría ahorrado otros 6 5 bytes.

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;

Ejecutar echo <hand> | php -nR '<code>o probarlo en línea .

Descompostura

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
;

Requiere PHP> = 5.6 (para e[...])

Titus
fuente
1
esto puede fallar "seises"
No es que Charles
1
@NotthatCharles: Eso me costó 11 bytes ... pero los recuperé. :)
Titus
1

Python 2 - 583 bytes

Soy demasiado nuevo para poder comentar publicaciones, así que solo publico mi versión de Python Solusion.

Se solucionó el problema con 'es' para pareja y tres de seis. Gracias a Not that 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 poco más legible con algunos comentarios

# 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
Zarigüeya muerta
fuente
También puede cambiar en las últimas filas j=0; if [z]*3==v:r="three %ss"%i(z)a if [z]*3==v:r="three %ss"%d[z][0]Pero ahorra solo 1 byte
Dead Possum
1
esto puede fallar "seises"
No es que Charles
1
@NotthatCharles Sí, gracias por notarlo. He agregado una solución
Dead Possum