Word Poker, wer gewinnt?

13

Die Eingabe besteht aus zwei Wörtern mit fünf Buchstaben. Es müssen eigentlich keine Wörter aus dem Wörterbuch sein, sondern jeweils nur fünf Buchstaben, ganz in Klein- oder Großbuchstaben, wie Sie möchten. In den Eingabewörtern wird nur AZ angezeigt, und die Länge beträgt immer 5 Zeichen.

Ihr Programm besteht darin, beide wie Pokerhände zu bewerten und die höhere Hand auszugeben. Natürlich treffen hier keine Anzüge zu, nur Ranglisten, so dass es keine Flushes gibt.

Das typische Poker-Ranking-System lautet: "1 Paar", "2 Paare", "3 Gleiche", "Straight", "Full House", "4 Gleiche", "5 Gleiche" und natürlich Es besteht die Möglichkeit, dass die Hand (oder das Wort in diesem Fall) nichts wert ist.

Bei Gleichstand gelten Buchstaben, die näher an A liegen, als höher, sodass ein Paar As ein Paar Bs schlägt. In einigen Fällen können beide Hände identisch sein, aber in einer anderen Reihenfolge (oder nicht). In diesem Fall wird entweder eine Hand oder eine neu erstellte Version davon ausgegeben.

Diese externe Seite enthält Informationen darüber, wie Sie den Gewinner identifizieren können, und befasst sich insbesondere mit Unentschieden innerhalb der spezifischen Ranglisten, falls Sie nicht mit dem Erzielen von Pokerhänden vertraut sind.

Bei Geraden : Die Buchstaben müssen im Alphabet nebeneinander stehen und dürfen nicht umlaufen. Also ist 'defgh' in beliebiger Reihenfolge ein Straight, 'xyzab' nicht.

Beispiele, wie man eine einzelne Hand erzielt:

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

Das Programm wird also tatsächlich zu folgenden Ergebnissen führen:

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

Die Reihenfolge der Buchstaben sowohl in der Eingabe als auch in der Ausgabe ist irrelevant, daher kann die Reihenfolge in Ihrer Ausgabe von der Eingabe abweichen, es muss jedoch derselbe Bestand an Buchstaben vorhanden sein.

Die Ausgabe muss genau fünf Buchstaben enthalten - nicht mehr und nicht weniger.

Es gelten die üblichen Codegolfregeln. Kürzester Code gewinnt.

Tintenfisch
quelle

Antworten:

4

JavaScript ( 224 218 213 Byte)

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)

Ungolfed:

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
)

Läuft map()nach, n + zbestimmt die Rangfolge einer Hand:

Bildbeschreibung hier eingeben

(Sie können verstehen, warum ich zauf 3.5 initialisiert habe.)

Im Falle eines Gleichstands Object.keys(o).sort()wird verwendet, um die übergeordnete Hand zu bestimmen.

Snippet:

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
quelle
3

Jelly ,  28 27 29  27 Bytes

+2 & dann -2 Fehler beheben, dann erneut Golf spielen.

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

Ein monadischer Link, der eine Liste von "Händen" aufnimmt und einen der Gewinner zurückgibt.

Funktioniert für die Eingabe in Groß- oder Kleinbuchstaben.
(... aber nicht gemischt, dafür die letzte Zeile mit Œloder voranstellen Œu).

Probieren Sie es online! oder sehen Sie sich die Testsuite an .

Wie?

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
quelle
So verdammt kurz im Vergleich zu dem, was ich in JS 0.o mache
Stephen
3
@StephenS Willkommen bei PPCG, wo Sie etwas in einer anderen Sprache als Golf machen und dann jemand etwas in Jelly, 05AB1E, Pyth, CJam usw. macht, das kürzer ist als Ihr Name: I: P
HyperNeutrino
1
@StephenS - JS sollte mit JS konkurrieren. Lassen Sie sich von Golfsprachen nicht davon abhalten, durchdachte Lösungen in anderen Sprachen einzureichen!
Jonathan Allan
@JonathanAllan es mich davon ab, zu viel Mühe in Grübeln und abstrahiert ein Problem abschreckt , die in ~ 25 Zeichen gelöst werden können, ist hier die Geige ich arbeite - ich alle vorformulierten und keinen des eigentlichen Code geschrieben
Stephen
Das ist großartig, aber ich habe kürzlich einen Testfall hinzugefügt, der nicht berechnet werden kann, insbesondere ["hhhij", "hijkl"]. Ich denke, es liegt an der Art und Weise, wie Sie eine Straße als [3,1,1,1,1] einstufen?
Octopus
3

JavaScript ( 250 247 232 Byte)

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)

Ungolfed Code & Testfälle in JSFiddle: https://jsfiddle.net/CookieJon/8yq8ow1b/

Dank @RickHitchcock einige Bytes gespart. @StephenS & @Arnauld

Holperig
quelle
Dies ist, was ich machen wollte, hatte aber keine Ahnung, wie man macht.
Stephen
Ich habe es auch nicht getan, bis ich angefangen habe! :-)
Holprig
s=0,h=0=> s=h=0Ich glaube
Stephen
1
Behoben jetzt nach vielem Haarziehen. Die Ermittlung der Tiebreak in Fällen , in denen die Hand , um die gleiche und die niedrigsten Zeichen in der 1. und 2. ist größten Gruppen wurden die gleiche war der Killer (33 Bytes oder so nur für das !?) :-(
Bumpy
x[v]=x[v]?++x[v]:1werden kann x[v]=(x[v]|0)+1, 3 Bytes sparen.
Rick Hitchcock
2

Python 2.7, 242 223 Bytes

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]

Ähnelt im Grundkonzept den Javascript-Beispielen (Sortierung nach Handkraft mit Ausnahme von Geraden; dann nach Rang); aber ausnutzen hat collections.Counterleider .most_commonnicht ganz das gewünschte verhalten; musste also einen benutzerdefinierten Sortierschlüssel hinzufügen.

Edit: ein bisschen mehr Code-Golfen, um 19 Bytes zu reduzieren.

Code ohne 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
quelle
1

Mathematica, 635 Bytes

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]])&

.
.
Eingabeformular

["abcde", "kkekk"]

J42161217
quelle
Gibt es eine Möglichkeit, dies online zu testen?
Octopus
1
sandbox.open.wolframcloud.com/app/objects einfügen mit strg + v die eingabe am ende des codes hinzufügen und mit shift + enter
ausführen