Word Poker, qui gagne?

13

L'entrée sera composée de deux mots de cinq lettres. Ils ne doivent pas nécessairement être des mots du dictionnaire, seulement cinq lettres chacun, tous en minuscules ou en majuscules, selon votre choix. Seul AZ apparaîtra dans les mots saisis et ils auront toujours 5 caractères.

Votre programme consiste à les marquer tous les deux comme s'ils étaient des mains de poker et à produire la main la plus élevée. Bien sûr, les costumes ne s'appliqueront pas ici, seulement les classements, donc il n'y a pas de couleurs.

Le système de classement de poker typique est le suivant: «1 paire», «2 paires», «3 d'une sorte», «droit», «full house», «4 d'une sorte», «5 d'une sorte», et bien sûr il est possible que la main (ou le mot dans ce cas) ne vaille rien.

Dans le cas de liens , les lettres plus proches de A sont considérées comme plus élevées, donc une paire de As bat une paire de Bs. Dans certains cas, les deux mains peuvent être identiques, mais dans un ordre différent (ou non), dans ce cas, sortez la main ou une version utilisée.

Cette page externe contient des informations sur la façon d'identifier le gagnant et aborde en particulier les liens dans les classements spécifiques, au cas où vous ne savez pas comment marquer des mains de poker.

Dans le cas des lignes droites : les lettres doivent être adjacentes dans l'alphabet et ne doivent pas être enroulées. Donc «defgh» dans n'importe quel ordre est une ligne droite, «xyzab» ne l'est pas.

Exemples pour marquer une seule main:

word   | scored as
---------------------
ccccc  | 5 of a kind     <-- highest ranking
woooo  | 4 of a kind
opopo  | full house
vurst  | straight
vovvu  | 3 of a kind
ppoww  | 2 pairs
upper  | 1 pair
kjsdf  | high card only (in this case D) <-- lowest ranking

Le programme produira donc des résultats comme celui-ci:

input        |  output
-----------------------
voviu,kjsdf  |  voviu     because a pair beats nothing 
opoqo,upper  |  opoqo     because 3 of a kind beats a pair
woooo,ggegg  |  ggegg     because 4 Gs beats 4 Os
queue,hopup  |  queue     because 2 pairs beats 1 pair
lodpl,ddkop  |  ddkop     because pair DD beats pair LL
huhyg,hijht  |  huhyg     both have pair HH, but G beats I
ddffh,ccyyz  |  ccyyz     both have 2 pairs, but CC(yyz) beats DD(ffh)
okaok,nkunk  |  nkunk     KK ties with KK, but NN beats OO
abcdf,bcdef  |  bcdef     because it is a straight
qtery,retyq  |  qtery     identical! so doesnt matter
abedc,vyxwz  |  abedc     because it is a "higher" straight
hhhij,hijkl  |  hijkl     because straight beats 3 of a kind
aaabb,zzzzz  |  zzzzz     because nothing beats 5 of a kind

L'ordre des lettres dans l'entrée et la sortie n'est pas pertinent, donc l'ordre dans votre sortie peut être différent de l'entrée, mais le même inventaire des lettres doit être présent.

La sortie doit contenir exactement cinq lettres - ni plus, ni moins.

Les règles habituelles de codegolf s'appliquent. Le code le plus court gagne.

Poulpe
la source

Réponses:

4

JavaScript ( 224 218 213 octets)

s=>t=>(v=s=>(o={},l=n=0,z=3.5,[...s].sort().map(c=>(n+=o[c]=-~o[c],z*=!l|l+1==(l=c.charCodeAt()))),[n+z,Object.keys(o).sort((a,b)=>o[b]-o[a]||(o[b]>o[a]?1:-1))]),w=v(s),x=v(t),w[0]>x[0]||w[0]==x[0]&&w[1]<x[1]?s:t)

Non golfé:

s=>t=>(
  v=s=>(
    o={},
    l=n=0,
    z=3.5,
    [...s].sort().map(c=>(
      n+=o[c]=-~o[c],
      z*=!l|l+1==(l=c.charCodeAt())
    )),
    [n+z,Object.keys(o).sort((a,b)=>o[b]-o[a]||(o[b]>o[a]?1:-1))]
  ),
  w=v(s),x=v(t),
  w[0]>x[0] || w[0]==x[0] && w[1]<x[1] ? s : t
)

Après les map()runs, n + zdétermine le classement d'une main:

entrez la description de l'image ici

(Vous pouvez comprendre pourquoi j'ai initialisé zà 3.5.)

En cas d'égalité, Object.keys(o).sort()est utilisé pour déterminer la main la mieux classée.

Fragment:

f=

s=>t=>(v=s=>(o={},l=n=0,z=3.5,[...s].sort().map(c=>(n+=o[c]=-~o[c],z*=!l|l+1==(l=c.charCodeAt()))),[n+z,Object.keys(o).sort((a,b)=>o[b]-o[a]||(o[b]>o[a]?1:-1))]),w=v(s),x=v(t),w[0]>x[0]||w[0]==x[0]&&w[1]<x[1]?s:t)

console.log(/voviu/.test(f('voviu')('kjsdf')))       //because a pair beats nothing 
console.log(/opoqo/.test(f('opoqo')('upper')))       //because 3 of a kind beats a pair
console.log(/ggegg/.test(f('woooo')('ggegg')))       //because 4 Gs beats 4 Os
console.log(/queue/.test(f('queue')('hopup')))       //because 2 pairs beats 1 pair
console.log(/ddkop/.test(f('lodpl')('ddkop')))       //because pair DD beats pair LL
console.log(/huhyg/.test(f('huhyg')('hijht')))       //both have pair HH, but G beats I
console.log(/ccyyz/.test(f('ddffh')('ccyyz')))       //both have 2 pairs, but CC(yyz) beats DD(ffh)
console.log(/nkunk/.test(f('okaok')('nkunk')))       //KK ties with KK, but NN beats OO
console.log(/bcdef/.test(f('abcdf')('bcdef')))       //because it is a straight
console.log(/qtery|retyq/.test(f('qtery')('retyq'))) //identical! so doesnt matter
console.log(/abedc/.test(f('abedc')('vyxwz')))       //because it is a "higher" straight
console.log(/hijkl/.test(f('hhhij')('hijkl')))       //because straight beats 3 of a kind
console.log(/zzzzz/.test(f('aaabb')('zzzzz')))       //because nothing beats 5 of a kind

Rick Hitchcock
la source
3

Gelée ,  28 27 29  27 octets

+2 puis -2 corrigent un bug, puis rejouent.

FI=1ȦḤW
OµNĠLÞṚịµL€+Ç,N
ÇÞṪ

Un lien monadique prenant une liste de "mains" et renvoyant (l'un des) gagnants.

Fonctionne pour les entrées tout en majuscules OU tout en minuscules.
(... mais pas mélangé, pour cela préfixer la dernière ligne avec Œlou Œu).

Essayez-le en ligne! ou consultez la suite de tests .

Comment?

FI=1ȦḤW - Link 1, straight offset: grouped and reverse sorted hand ordinals
        -                     e.g. [[-101],[-100],[-99],[-98],[-97]]
F       - flatten                  [-101,-100,-99,-98,-97]
 I      - increments               [1,1,1,1]
  =1    - equal 1? (vectorises)    [1,1,1,1]
    Ȧ   - any and all?             1
     Ḥ  - double                   2
      W - wrap in a list           [2]
        -   The purpose of this is so that when "a" from Link 2 represents a straight we
        -   get [2], whereas for any other hand we get [0]. Adding the [2] to [1,1,1,1,1]
        -   (the lengths of a straight's groups) yields [3,1,1,1,1], placing it between
        -   three of a kind, [3,1,1], and a full house, [3,2], as required.

OµNĠLÞṚịµL€+Ç,N - Link 2, hand rank key function: list of characters       e.g. "huhyg"
O               - cast to ordinals                                [104,117,104,121,103]
 µ              - monadic chain separation, call that o
  N             - negate (to give them a reverse-sort order) [-104,-117,-104,-121,-103]
   Ġ            - group indices by value                            [[4],[2],[1,3],[5]]
     Þ          - sort by key function:
    L           -   length                                          [[4],[2],[5],[1,3]]
      Ṛ         - reverse                                           [[1,3],[5],[2],[4]]
       ị        - index into o                       [[-104,-104],[-103],[-117],[-121]]
        µ       - monadic chain separation (call that a)
         L€     - length of €ach                                              [2,1,1,1]
            Ç   - call last link (2) as a monad -> [isStraight? * 2]                [0]
           +    - addition (vectorises)                                       [2,1,1,1]
              N - negate o                                [[104,104],[103],[117],[121]]
             ,  - pair                        [[2,1,1,1],[[104,104],[103],[117],[121]]]
                -   now sorting by this will first be comparing the hand class, and if
                -   and only if they match comparing the card values in the required order.

ÇÞḢ - Main link: list of lists of characters (list of hands)
 Þ  - sort by key function:
Ç   -   last link (2) as a monad
  Ṫ - tail (best or an equal-best hand)
Jonathan Allan
la source
Tellement effrayant par rapport à ce que je fais en JS 0.o
Stephen
3
@StephenS Bienvenue sur PPCG, où vous faites quelque chose dans une langue non golfique et ensuite quelqu'un fait quelque chose dans Jelly, 05AB1E, Pyth, CJam, etc. qui est plus court que le nom de votre langue: I: P
HyperNeutrino
1
@StephenS - JS devrait rivaliser avec JS. Ne laissez pas les langues de golf vous dissuader de soumettre des solutions bien pensées dans d'autres langues!
Jonathan Allan
@JonathanAllan, cela me dissuade de faire trop d'efforts pour réfléchir et résumer un problème qui peut être résolu en ~ 25 caractères, voici le violon sur lequel je travaillais - j'ai écrit tout le passe-partout et aucun du code réel
Stephen
C'est génial, mais j'ai récemment ajouté un cas de test que cela ne calcule pas, en particulier ["hhhij", "hijkl"]. Je pense que c'est à cause de la façon dont vous classez une ligne droite comme [3,1,1,1,1]?
Octopus
3

JavaScript ( 250 247 232 octets)

S=d=>(x={},l=99,h=s=0,[...d].map(v=>x[v]=-~x[v]),Object.keys(x).map(v=>(c=91-v.charCodeAt(),t=x[v],s+=1e4**t,c<x[t]?0:x[t]=c,g=(h=c>h?c:h)-(l=c<l?c:l))),[5,4,3,2,1].map(v=>s+=0|x[v]**v),s+(s<5e7&&g<5?1e13:0)),C=a=>b=>(S(a)>S(b)?a:b)

Code non testé et cas de test dans JSFiddle: https://jsfiddle.net/CookieJon/8yq8ow1b/

Enregistré quelques octets grâce à @RickHitchcock. @StephenS & @Arnauld

Cahoteux
la source
C'est ce que j'essayais de faire mais je n'avais aucune idée de comment faire.
Stephen
Je ne l'ai pas fait non plus avant de commencer! :-)
Bumpy
s=0,h=0=> s=h=0Je crois
Stephen
1
Fixé maintenant après beaucoup de cheveux. Déterminer le bris d'égalité dans les cas où la main est la même ET que les caractères les plus bas dans les 1er et 2e plus grands groupes étaient les mêmes était le tueur (33 octets ou plus JUSTE pour cela!?) :-(
Bumpy
x[v]=x[v]?++x[v]:1peut devenir x[v]=(x[v]|0)+1, en économisant 3 octets.
Rick Hitchcock
2

Python 2.7, 242 223 octets

from collections import*
s=sorted
f=lambda x,y:s(map(lambda h:(lambda (r,n):((3,1.5)if len(r)==5 and ord(r[0])+4==ord(r[4])else n,[-ord(d) for d in r],h))(zip(*s(Counter(h).items(),key=lambda z:(-z[1],z[0])))),(x,y)))[1][2]

Similaire dans le concept de base aux exemples javascript (trier par la force de la main à l'exception des lignes droites, puis par rang); mais profiter de collections.CounterMalheureusement, .most_commonn'a pas tout à fait le comportement souhaité; a donc dû ajouter une clé de tri personnalisée.

Edit: un peu plus de code golf pour réduire 19 octets.

Code non golfé

from collections import Counter

def convertHand(h):
    # first get item counts, appropriately ordered; e.g. cbabc -> (('b',2), ('c',2),('a',1))
    sortedPairs = sorted(Counter(h).items(),key=lambda x:(-x[1],x[0]))

    # 'unzip' the tuples to get (('b','c','a'), (2,2,1))
    ranks, numberFound = zip(*sortedPairs) 

    if len(ranks)==5:
        # no pairs; is it a straight? well, since they are in increasing order...
        if ord(ranks[0])+4 == ord(ranks[4]):
            # replace numberFound with something that will sort above 3 of a kind but below full house
            numberFound = (3,1.5)

    # invert the values of the ranks, so they are in decreasing, rather then increasing order
    ranks = [-ord(r) for r in ranks]

    # arrange tuples so we can sort by numberFound, and then ranks; and keep a reference to the hand
    return (numberFound, ranks, h)

# put it all together...
def f(x,y):
    hands = [convertHand(h) for h in (x,y)]
    rankedHands = sorted(hands)
    return rankedHands[1][2]
Chas Brown
la source
1

Mathematica, 635 octets

H[x_]:=Block[{t},T=Sort@ToCharacterCode[x];L=Last/@Tally@T;t=0;S=Count;If[S[L,2]==1,t=1];If[S[L,2]==2,t=2];If[S[L,3]==1,t=3];If[S[Differences@T,1]==4,t=4];If[S[L,2]==1&&S[L,3]==1,t=5];If[S[L,4]==1,t=6];If[S[L,5]==1,t=7];t];F[K_,v_]:=First@Flatten@Cases[Tally@K,{_,v}];B=ToCharacterCode;(Z=Sort@B@#1;Y=Sort@B@#2;a=H[#1];b=H[#2];If[a>b,P@#1,If[a<b,P@#2]]If[a==b&&a==0,If[Z[[1]]<Y[[1]],P@#1,P@#2]];If[a==b&&(a==1||a==2),If[F[Z,2]<F[Y,2],P@#1,If[F[Z,2]==F[Y,2],If[F[Z,1]<F[Y,1],P@#1,P@#2],P@#2]]];If[a==b&&(a==3||a==5),If[F[Z,3]<F[Y,3],P@#1,P@#2]];If[a==b&&a==6,If[F[Z,4]<F[Y,4],P@#1,P@#2]];If[a==b&&(a==7||a==4),If[Tr@Z<Tr@Y,P@#1,P@#2]])&

.
.
Formulaire de saisie

["abcde", "kkekk"]

J42161217
la source
Existe-t-il un moyen de tester cela en ligne?
Octopus
1
sandbox.open.wolframcloud.com/app/objects coller avec ctrl + v ajouter l'entrée à la fin du code et exécuter avec shift + enter
J42161217