शब्द पोकर, कौन जीता?


14

इनपुट दो पांच अक्षर के शब्द होंगे। उन्हें वास्तव में शब्दकोश शब्द नहीं होना चाहिए, बस कोई पांच अक्षर, सभी लोअरकेस या सभी बड़े अक्षर, आपकी पसंद। केवल AZ इनपुट शब्दों में दिखाई देगा और वे हमेशा लंबाई में 5 वर्ण होंगे।

आपका कार्यक्रम उन दोनों को स्कोर करना है जैसे कि वे पोकर हाथ थे और उच्च हाथ का उत्पादन करते थे। बेशक सूट यहां लागू नहीं होगा, केवल रैंकिंग ताकि कोई फ्लश न हो।

सामान्य पोकर रैंकिंग प्रणाली इस प्रकार है: '1 जोड़ी', '2 जोड़े', '3 ऑफ ए टाइप', 'स्ट्रेट', 'फुल हाउस', 'एक तरह का 4', 'एक तरह का 5', और निश्चित रूप से संभावना है कि इस मामले में हाथ (या शब्द) कुछ भी नहीं हो सकता है।

संबंधों के मामले में , A के करीब के अक्षरों को अधिक माना जाता है, इसलिए As की एक जोड़ी Bs की एक जोड़ी को हरा देती है। कुछ मामलों में दोनों हाथ समान हो सकते हैं, लेकिन एक अलग क्रम में (या नहीं), उस स्थिति में आउटपुट या तो हाथ में होता है या इसका एक समर्थित संस्करण होता है।

इस बाहरी पृष्ठ में विजेता की पहचान करने के बारे में जानकारी होती है और विशेष रूप से विशिष्ट रैंकिंग के भीतर संबंधों को संबोधित करता है, यदि आप पोकर हाथों को कैसे स्कोर करते हैं, इससे परिचित नहीं हैं।

पट्टियों के मामले में : अक्षरों को वर्णमाला में आसन्न होना चाहिए और चारों ओर लपेटने की अनुमति नहीं है। अतः किसी भी क्रम में 'डिफग' एक सीधा है, 'एक्सज़ैब' नहीं है।

एकल हाथ कैसे स्कोर करें, इसके उदाहरण:

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

तो कार्यक्रम वास्तव में इस तरह से परिणाम देगा:

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

इनपुट और आउटपुट दोनों में अक्षरों का क्रम अप्रासंगिक है, इसलिए आपके आउटपुट में ऑर्डर इनपुट से अलग हो सकता है, लेकिन अक्षरों की एक ही सूची मौजूद होनी चाहिए।

आउटपुट में ठीक पाँच अक्षर होने चाहिए - और नहीं, कम नहीं।

सामान्य कोडगुल्फ नियम लागू होते हैं। सबसे छोटा कोड जीतता है।

जवाबों:


4

जावास्क्रिप्ट ( 224 218 213 बाइट्स)

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
)

map()रन के बाद , n + zएक हाथ की रैंकिंग निर्धारित करता है:

यहाँ छवि विवरण दर्ज करें

(आप समझ सकते हैं कि मैंने z3.5 की शुरुआत क्यों की ।)

एक टाई के मामले में, Object.keys(o).sort()उच्च रैंकिंग हाथ का निर्धारण करने के लिए उपयोग किया जाता है।

स्निपेट:

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


3

जेली ,  28 27 29  27 बाइट्स

+2 & फिर -2 एक बग को ठीक करें, फिर से गोल्फ।

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

"हाथ" और लौटने वाले (विजेताओं में से एक) की सूची लेने वाला एक उन्मादी लिंक।

ऑल-अपरकेस या ऑल-लोअरकेस इनपुट के लिए काम करता है।
(... लेकिन मिश्रित नहीं है, इसके लिए अंतिम पंक्ति के साथ Œlया Œu) को रोकें ।

इसे ऑनलाइन आज़माएं! या परीक्षण सूट देखें।

कैसे?

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)

इसलिए जेएस 0.o
स्टीफन

3
@StephenS PPCG में आपका स्वागत है, जहाँ आप कुछ गैर-गोल्फ भाषा में कुछ बनाते हैं और फिर कोई व्यक्ति Jelly, 05AB1E, Pyth, CJam, आदि में कुछ बनाता है, जो आपकी भाषा के नाम से छोटा है: I: P
हाइपरट्यूटिनो

1
@StephenS - JS को JS से मुकाबला करना चाहिए। अन्य भाषाओं में अच्छी तरह से सोचा समाधान प्रस्तुत करने से आपको गोल्फ भाषाओं को बाधित न करने दें!
जोनाथन एलन

@JonathanAllan यह मुझे 25 से अधिक वर्णों में हल की जा सकने वाली समस्या को दूर करने और अमूर्त करने में बहुत अधिक प्रयास करने से रोकता है, यहाँ मैं जिस फिडेल पर काम कर रहा था - मैंने सभी बायलरप्लेट और वास्तविक कोड में से कोई भी नहीं लिखा
स्टीफन

यह बहुत बढ़िया है, लेकिन मैंने हाल ही में एक परीक्षण मामला जोड़ा है जो यह गणना नहीं करता है, विशेष रूप से ["हिहज", "हिजकल"]। मुझे लगता है कि जिस तरह से आप सीधे [३,१,१,१,१,१] रैंक करते हैं?
ऑक्टोपस

3

जावास्क्रिप्ट ( 250 247 232 बाइट्स)

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)

जेएसफिल्ड में अनकॉल्ड कोड और टेस्ट केस: https://jsfiddle.net/CookieJon/8yq8u1b/

@RickHitchcock के लिए धन्यवाद के साथ कुछ बाइट्स सहेजे गए। @StephenS & @Arnauld


यह वही है जो मैं बनाने की कोशिश कर रहा था लेकिन कोई सुराग नहीं था कि कैसे बनाऊं।
स्टीफन

न ही मैंने शुरू करने के बाद तक किया! :-)
बम्पी

s=0,h=0=> s=h=0मेरा मानना ​​है
स्टीफन

1
बहुत बाल खींचने के बाद अब ठीक किया गया। उन मामलों में टाई-ब्रेकर का निर्धारण करना जहां हाथ समान है और 1 और 2 सबसे बड़े समूहों में सबसे कम वर्ण एक ही हत्यारे थे (33 बाइट्स या उसके लिए बस इतना !?) :-(
ऊबड़

x[v]=x[v]?++x[v]:1बन सकता है x[v]=(x[v]|0)+1, 3 बाइट्स की बचत।
रिक हिचकॉक

2

पायथन 2.7, 242 223 बाइट्स

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]

जावास्क्रिप्ट के उदाहरणों के लिए मूल अवधारणा में भी इसी तरह (हाथ की ताकत से स्ट्रैच के लिए अपवाद; फिर रैंक द्वारा); लेकिन collections.Counterदुर्भाग्य से लाभ उठाते हुए , .most_commonवांछित व्यवहार नहीं है; इसलिए एक कस्टम सॉर्ट कुंजी जोड़ना था।

संपादित करें: 19 बाइट्स को ट्रिम करने के लिए थोड़ा और कोड गोल्फिंग।

अन-गोल्फ कोड

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]

1

गणितज्ञ, 635 बाइट्स

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



इनपुट फॉर्म

["एबकेड", "केकेक"]


क्या इसका ऑनलाइन परीक्षण करने का कोई तरीका है?
ऑक्टोपस

2
sandbox.open.wolframcloud.com/app/objects ctrl + v के साथ पेस्ट को कोड के अंत में इनपुट जोड़ें और शिफ्ट + एंटर के साथ चलाएं
J42161217
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.