Nommez la main de vantardise

11

Contexte

Brag est un jeu de cartes similaire au concept, mais plus simple que le poker. Une main vante se compose de trois cartes et est classée comme suit du plus haut au plus bas:

  • Trois d'une sorte - les trois cartes du même rang. Nommé "trois rois", etc.

  • Flush courant aka flush droite. Les trois cartes de même couleur et de rangs consécutifs. La main est nommée par les trois cartes dans l'ordre croissant, suivies des mots "au rebond" pour faire la distinction avec une simple course / ligne droite, par exemple "dix-jack-queen au rebond". Notez qu'un as est soit haut soit bas mais pas les deux - "king-ace-two" n'est pas une course.

  • Exécutez aka directement. Comme ci-dessus mais sans obligation de faire correspondre les costumes. Nommé simplement par exemple "ten-jack-queen".

  • Flush - les trois cartes de la même couleur, nommées d'après le rang le plus élevé, par exemple "Ace flush".

  • Paire - deux cartes de même rang avec un tiers d'un autre rang de version. Nommé "paire de trois", etc.

  • Toute autre combinaison, nommée d'après le rang le plus élevé, par exemple "as de haut".

Défi

Étant donné trois cartes à jouer, sortez le nom de la main de vantardise qu'ils sortent.

Les cartes seront entrées soit sous forme de trois chaînes de 2 caractères, soit concaténées sous la forme d'une seule chaîne de 6 caractères (selon la préférence de votre implémentation), où la première de chaque paire correspond au rang (2 ... 9, T, J, Q, K, A) et le second signifie la combinaison (H, C, D, S).

Les règles de golf standard s'appliquent - écrivez un programme ou une fonction qui accepte cette entrée et génère le nom de la main comme détaillé ci-dessus.

Vous pouvez supposer que l'entrée sera valide (rangs et combinaisons dans la plage ci-dessus, pas de carte répétée) et dans tous les cas que vous préférez, mais ne sera pas dans un ordre particulier.

La sortie doit être soit en majuscules, soit en minuscules, soit en majuscules raisonnables, par exemple en cas de titre ou en cas de phrase. Les rangs numériques doivent être précisés, par exemple "dizaines" et non 10s.

Exemples d'entrées et sorties:

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"

Ceci est ma première tentative de défi sur ce site, veuillez suggérer des améliorations mais soyez doux :)

IanF1
la source
4
Bienvenue chez PPCG! Je n'ai fait qu'effleurer le défi jusqu'à présent, mais il semble décent pour un premier défi. Cela dit, écrire de bons défis est difficile et pour l'avenir, je recommanderais d'abord de publier des idées dans le bac à sable où vous pouvez obtenir des commentaires et améliorer les détails de la spécification avant de risquer des votes négatifs, des votes serrés et des réponses qui pourraient être invalidées par des modifications ultérieures du défi.
Martin Ender
@MartinEnder merci! J'aurai certainement jeté un œil au bac à sable la prochaine fois.
IanF1
Pouvons-nous obtenir des entrées sous forme de tableaux de tuples? De plus, pouvons-nous raccourcir la sortie comme «king flush» en «fk»?
Matthew Roh
1
veuillez ajouter "6D6C6S"comme cas de test puisque six est un pluriel impair
Pas que Charles

Réponses:

2

Rubis, 384 , 320

Accepte un tableau de chaînes à deux caractères.

Traduit les valeurs de pip en valeurs hexadécimales et identifie les mains en fonction du nombre de valeurs de pip distinctes.

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

Annoté:

->*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]
}
Pas que Charles
la source
3

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

* passe maintenant les «six» * merci à Ben Frankel pour avoir économisé 46 octets!


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

Essayez-le en ligne!

Merci pour un premier défi sympa!

Stephen
la source
1
Quelques suggestions de golf en espace blanc: TIO
math junkie
Merci! Je savais que l'espace blanc ajoutait beaucoup d'octets mais je pensais qu'il fallait 4 espaces. Édité! @math_junkie
Stephen
@ user7686415 Ou vous pouvez utiliser des onglets réels à la place.
mbomb007
1
@NotthatCharles l'a corrigé!
Stephen
1
@Stephen, bien sûr. D.get(a, b)signifie accéder à la valeur dans le dict D à la clé a, avec la valeur par défaut b si la clé n'est pas trouvée. C'est la même chose que l'écriture D[a] if a in D else b, qui est la même chose que l'écriture D[a] if a in D.keys() else b.
Ben Frankel
2

PHP, 413 405 398 409 408 406 398 octets

Malheureusement, PHP ne prend pas en charge le référencement de tableaux imbriqués à l'intérieur de chaînes;
cela aurait permis d'économiser encore 6 5 octets.

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;

Exécutez-le echo <hand> | php -nR '<code>ou testez-le en ligne .

panne

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
;

Nécessite PHP> = 5.6 (pour e[...])

Titus
la source
1
cela peut échouer "six"
Pas que Charles
1
@NotthatCharles: Cela m'a coûté 11 octets ... mais je les ai revus. :)
Titus
1

Python 2 - 583 octets

Je suis trop nouveau pour pouvoir commenter des articles, alors je poste juste ma version de python solusion.

Correction d'un problème avec «es» pour la paire et trois des six. Merci à 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 peu plus lisible avec quelques commentaires

# 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
Possum mort
la source
Peut également changer dans les dernières lignes j=0; if [z]*3==v:r="three %ss"%i(z)en if [z]*3==v:r="three %ss"%d[z][0]Mais il enregistre seulement 1 octet
Dead Possum
1
cela peut échouer "six"
Pas que Charles
1
@NotthatCharles Oui, merci d'avoir remarqué. J'ai ajouté un correctif
Dead Possum