Övünme Elini adlandırın


11

Arka fon

Brag, kavram olarak pokere benzeyen ancak daha basit bir kart oyunudur. Övünme bir el üç karttan oluşur ve en yüksekten en düşüğe doğru aşağıdaki gibi sıralanır:

  • Üçlü - üç kartın hepsi aynı sırada. "Üç Kral" vb.

  • Floş akıntısı. Aynı türden ve arka arkaya üç kartın hepsi. El, üç kartla artan sırada adlandırılır ve ardından basit bir koşu / düzden ayırt etmek için "zıplamada" kelimeleri, örneğin "zıplamada on-jack-kraliçe" denir. Bir asın yüksek veya düşük olduğuna dikkat edin, ancak her ikisi birden değil - "king-ace-two" bir çalışma değildir.

  • Aka aka düz çalıştırın. Yukarıdaki gibi ama takım elbise eşleştirme gereksinimi olmadan. Basitçe, örneğin "on-jack-kraliçe" olarak adlandırılır.

  • Flush - her üç kart da aynı renktedir, en yüksek rütbeden sonra adlandırılır, örneğin "Ace flush".

  • Çift - iki kart, aynı sıralamayı başka bir sürüm sıralamasının üçte biri ile birlikte. "Üçlü çift" vb.

  • En yüksek rütbeden sonra adlandırılan diğer kombinasyonlar, örneğin "ace high".

Meydan okuma

Üç oyun kartı verildiğinde, çıkardıkları övünme elinin adını girin.

Kartlar üç 2 karakterli dizgi olarak girilecek veya her bir çiftin ilkinin sıralandığı (2 ... 9, T, J, Q, K, A) ve ikincisi takımı (H, C, D, S) gösterir.

Standart golf kuralları geçerlidir - bu girişi kabul eden ve yukarıda detaylı olarak elin adını veren bir program veya fonksiyon yazın.

Girişin geçerli olacağını (yukarıdaki aralıkta rütbe ve takım elbise, tekrarlanan kart yok) ve hangi durumda tercih ederseniz edin, ancak belirli bir sırada olmayacağını varsayabilirsiniz.

Çıktı, ya tüm büyük harflerde, tümü küçük harflerde ya da mantıklı bir büyük harf ya da başlık veya cümle durumunda olmalıdır. Sayısal sıralamaların açıklanması gerekir, örn. 10'lar değil "onlarca".

Örnek giriş ve çıkışlar:

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"

Bu, bu sitedeki bir meydan okumadaki ilk denemem, lütfen iyileştirmeler önerin ama nazik olun :)



4
PPCG'ye Hoşgeldiniz! Zorluğu şimdiye kadar gözden kaçırdım, ancak ilk meydan okuma için iyi görünüyor. Bununla birlikte, iyi zorluklar yazmak zordur ve gelecek için sandbox'ta fikir göndermenizi tavsiye ederim . meydan okuma.
Martin Ender

@MartinEnder teşekkürler! Bir dahaki sefere kum havuzuna bir göz atacağım.
IanF1

Tuples dizisi olarak girdi alabilir miyiz? Ayrıca, 'king flush' gibi çıktıyı 'fk' ye kısaltabilir miyiz?
Matthew Roh

1
"6D6C6S"altı garip bir çoğul olduğu için lütfen bir test örneği olarak ekleyin
Charles

Yanıtlar:


2

Yakut, 384 , 320

İki karakter dizesinden oluşan bir diziyi kabul eder.

Pip değerlerini onaltılık değerlere çevirir ve kaç farklı pip değerine bağlı olarak elleri tanımlar.

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

Açıklamalı:

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

3

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

* 46 bayt kazandığı için Ben Frankel'e teşekkürler!


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

Çevrimiçi deneyin!

Harika bir ilk meydan okuma için teşekkürler!


1
Bazı beyaz alan golf önerileri: TIO
math junkie

Teşekkürler! Beyaz alanın çok fazla bayt eklediğini biliyordum ama 4 boşluk gerektirdiğini düşündüm. Düzenlenen! @math_junkie
Stephen

@ user7686415 Veya bunun yerine gerçek sekmeleri kullanabilirsiniz.
mbomb007

1
@NotthatCharles düzeltti!
Stephen

1
@Stephen, Tabii. D.get(a, b)a tuşundaki dikte D'deki değere, anahtar bulunmazsa varsayılan b değeriyle erişilmesi anlamına gelir. Yazmakla aynı, yazmakla D[a] if a in D else baynı D[a] if a in D.keys() else b.
Ben Frankel

2

PHP, 413 405 398 409 408 406 398 bayt

Ne yazık ki, PHP dizeler içinde iç içe dizi başvurusunu desteklemez;
bu da başka bir 6 5 bayt tasarruf ederdi .

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;

Çevrimiçi olarak çalıştırın echo <hand> | php -nR '<code>veya test edin .

Yıkmak

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
;

PHP gerektirir> = 5.6 (için e[...])


1
Bu "sixes" başarısız olabilir
Charles

1
@ NotthatCharles: Bu bana 11 bayt mal oldu ... ama onları geri golf. :)
Titus

1

Python 2-583 bayt

Yayınları yorumlayamayacak kadar yeniyim, bu yüzden python çözümü versiyonumu gönderiyorum.

Çifti ve altıdan üçü için 'es' ile ilgili sorun düzeltildi. O Charles'a teşekkürler

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

Bazı yorumlarla biraz daha okunabilir

# 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

Ayrıca son sıralar halinde değişebilir j=0; if [z]*3==v:r="three %ss"%i(z)için if [z]*3==v:r="three %ss"%d[z][0]Ama sadece 1 byte kaydeder
Ölü Possum

1
Bu "sixes" başarısız olabilir
Charles

1
@NotthatCharles Evet, fark ettiğiniz için teşekkür ederim. Düzeltme ekledim
Dead Possum
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.