Kelime Poker, Kim Kazanır?


14

Girdi iki beş harfli kelime olacaktır. Aslında sözlük kelimeleri olmak zorunda değiller, her biri sadece beş harf, hepsi küçük harf veya tümü büyük harf, seçiminiz. Giriş kelimelerinde yalnızca AZ görünür ve her zaman 5 karakter uzunluğunda olurlar.

Programınız hem poker eli gibi hem de yüksek el çıktısı gibi puanlar almaktır. Elbette takım elbise burada geçerli olmayacak, sadece sıralamalar, bu yüzden yıkama yok.

Tipik poker sıralama sistemi şu şekildedir: '1 çift', '2 çift', 'tür 3', 'düz', 'tam ev', 'tür 4', 'tür 5' ve tabii ki elin (veya bu durumda kelimenin) hiçbir değere değmeyeceği ihtimali vardır.

Bağlar söz konusu olduğunda, A'ya daha yakın olan harfler daha yüksek olarak kabul edilir, bu nedenle bir çift As bir çift Bs'ı yener. Bazı durumlarda, her iki el de aynı olabilir, ancak farklı bir sırada (veya değil), bu durumda ya el ya da onun yeniden gönderilmiş bir versiyonunu çıktılar.

Bu harici sayfa , kazananın nasıl tanımlanacağı hakkında bilgi içerir ve özellikle poker ellerinin nasıl puanlanacağına aşina değilseniz, belirli sıralamalar içindeki bağları ele alır.

Düzlük durumunda : harfler alfabede bitişik olmalıdır ve etraflarına sarılmaları yasaktır. Yani herhangi bir sırada 'defgh' düzdür, 'xyzab' değildir.

Tek bir elin nasıl puanlanacağına örnekler:

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

Yani program aslında böyle sonuçlar üretecektir:

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

Hem giriş hem de çıkıştaki harflerin sırası önemsizdir, bu nedenle çıktınızdaki sıralama girişten farklı olabilir, ancak aynı harf envanterinin bulunması gerekir.

Çıktı tam olarak beş harf içermelidir - ne daha fazla ne daha az.

Her zamanki kodgolf kuralları geçerlidir. En kısa kod kazanır.

Yanıtlar:


4

JavaScript ( 224 218 213 bayt)

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
)

Sonra map()ishal, n + zbir elin sıralaması belirler:

resim açıklamasını buraya girin

(Neden z3.5'e başladığımı anlayabilirsiniz .)

Beraberlik durumunda Object.keys(o).sort(), daha üst sıradaki eli belirlemek için kullanılır.

Pasaj:

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

Jöle ,  28 27 29  27 bayt

+2 ve sonra -2 bir hatayı düzeltin, sonra yeniden golf yapın.

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

"Eller" listesini alan ve kazananlardan birini döndüren monadik bir link.

Tümü büyük harf veya tamamen küçük harf girişi için çalışır.
(... ancak karışık değil, bunun için son satırın başına Œlveya işareti ekleyin Œu).

Çevrimiçi deneyin! veya test takımına bakın .

Nasıl?

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)

JS 0.o'da yaptığım şeye kıyasla çok korkutucu kısa
Stephen

3
@StephenS bazı olmayan golf dilinde birşeyler yapma ve sonra birisi dil adı daha kısa olduğunu vb Jelly, 05AB1E, Pyth, CJam, bir şey yapar PPCG, hoş geldiniz: I: P
HyperNeutrino

1
@StephenS - JS, JS ile rekabet etmelidir. Golf dillerinin diğer dillerde iyi düşünülmüş çözümler sunmanızı engellemesine izin vermeyin!
Jonathan Allan

@JonathanAllan beni ~ 25 karakterle çözülebilecek bir problemi düşünmek ve soyutlamak için çok fazla çaba sarf etmekten alıkoyuyor, işte çalıştığım keman - tüm kazan levhasını yazdım ve gerçek kodun hiçbirini yazmadım
Stephen

Bu harika, ama son zamanlarda bunun hesaplanmadığı bir test durumu ekledim, özellikle ["hhhij", "hijkl"]. Bence bu [3,1,1,1,1] gibi bir sıraya koyma şekliniz yüzünden mi?
Ahtapot

3

JavaScript ( 250 247 232 bayt)

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)

JSFiddle'da kodlanmamış kod ve test örnekleri: https://jsfiddle.net/CookieJon/8yq8ow1b/

@RickHitchcock sayesinde bazı baytlar kurtardı. @KuzeymanAkdeniz


Yapmaya çalıştığım şey buydu ama nasıl yapılacağı hakkında hiçbir fikrim yoktu.
Stephen

Başladıktan sonra da yapmadım! :-)
İnişli çıkışlı

s=0,h=0=> s=h=0İnanıyorum
Stephen

1
Çok fazla saç çekildikten sonra düzeltildi. Elin aynı olduğu durumlarda kravat kırıcısının belirlenmesi VE 1. ve 2. en büyük gruplardaki en düşük karakterlerin aynı olduğu katil (bunun için 33 bayt kadar JUST !?) :-(
İnişli çıkışlı

x[v]=x[v]?++x[v]:1x[v]=(x[v]|0)+13 bayt tasarruf edebilir .
Rick Hitchcock

2

Python 2.7, 242 223 bayt

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]

Temel kavramda javascript örneklerine benzer (düzlükler hariç olmak üzere el gücüne göre sıralayın; sonra sıralamaya göre); ancak collections.CounterMaalesef faydalanmak .most_commonistenen davranışa sahip değildir; bu yüzden özel bir sıralama anahtarı eklemek zorunda kaldı.

Düzenleme: 19 bayt azaltmak için biraz daha kod golf.

Golf kodu yok

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

Mathematica, 635 bayt

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

.
.
Giriş formu

["abcde", "kkekk"]


Bunu çevrimiçi test etmenin bir yolu var mı?
Ahtapot

2
sandbox.open.wolframcloud.com/app/objects ctrl + v ile yapıştırın girişi kodun sonuna ekleyin ve shift + enter ile çalıştırın
J42161217
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.