Beri nama Brag Hand

11

Latar Belakang

Brag adalah permainan kartu yang mirip dengan konsep, tetapi lebih sederhana dari, poker. Hand in brag terdiri dari tiga kartu dan diberi peringkat sebagai berikut dari tertinggi ke terendah:

  • Tiga kartu sejenis - ketiga kartu memiliki peringkat yang sama. Dinamakan sebagai "tiga Raja" dll.

  • Running flush alias straight flush. Ketiga kartu dengan jenis yang sama dan peringkat berturut-turut. Tangan dinamai oleh tiga kartu dalam urutan menaik diikuti oleh kata-kata "pada bouncing" untuk membedakan dari run / lurus sederhana, misalnya "ten-jack-queen on the bounce". Catatan ace baik tinggi atau rendah tetapi tidak keduanya - "king-ace-two" bukan sebuah run.

  • Jalankan alias lurus. Seperti di atas tetapi tanpa persyaratan untuk mencocokkan jas. Diberi nama sederhana misalnya "ten-jack-queen".

  • Flush - ketiga kartu dengan jenis yang sama, dinamai berdasarkan peringkat tertinggi, misalnya "Ace flush".

  • Pasangkan - dua kartu dengan peringkat yang sama bersama dengan sepertiga dari peringkat versi lain. Dinamakan sebagai "sepasang bertiga" dll.

  • Kombinasi lainnya, dinamai dengan peringkat tertinggi, misalnya "ace high".

Tantangan

Diberikan tiga kartu remi, keluarkan nama tangan kebanggaannya.

Kartu akan dimasukkan sebagai tiga string 2-karakter atau digabung sebagai string 6-karakter tunggal (mana yang lebih disukai implementasi Anda), di mana yang pertama dari setiap pasangan adalah peringkat (2 ... 9, T, J, Q, K, A) dan yang kedua menandakan setelan (H, C, D, S).

Aturan main golf standar berlaku - tulis program atau fungsi yang menerima input ini dan mengeluarkan nama tangan seperti yang dijelaskan di atas.

Anda dapat mengasumsikan input akan valid (peringkat dan setelan dalam kisaran di atas, tidak ada kartu yang diulang) dan dalam hal apa pun yang Anda inginkan, tetapi tidak akan berada dalam urutan tertentu.

Keluaran harus dalam semua modal, semua huruf kecil, atau huruf besar yang masuk akal misalnya huruf besar atau huruf besar. Peringkat numerik harus dijabarkan misalnya "puluhan" bukan 10.

Input & output sampel:

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"

Ini adalah upaya pertama saya pada tantangan di situs ini, tolong sarankan perbaikan tapi lembut :)

IanF1
sumber
3
Terkait Terkait
Martin Ender
4
Selamat datang di PPCG! Saya hanya membaca skim tantangan sejauh ini, tetapi tampaknya layak untuk tantangan pertama. Yang mengatakan, menulis tantangan yang baik itu sulit dan untuk masa depan saya akan merekomendasikan memposting ide di kotak pasir pertama di mana Anda bisa mendapatkan umpan balik dan meningkatkan detail spesifikasi sebelum mengambil risiko downvotes, tutup suara dan jawaban yang mungkin tidak valid dengan perubahan di kemudian hari pada tantangan.
Martin Ender
@ MartinEnder terima kasih! Saya pasti akan melihat kotak pasir waktu berikutnya.
IanF1
Bisakah kita mendapatkan input sebagai array tuple? Juga, dapatkah kita mempersingkat output seperti 'king flush' menjadi 'fk'?
Matthew Roh
1
tolong tambahkan "6D6C6S"sebagai test case karena enam jamak yang aneh
Bukan berarti Charles

Jawaban:

2

Ruby, 384 , 320

Menerima serangkaian string dua char.

Menerjemahkan nilai pip menjadi nilai hex dan mengidentifikasi tangan berdasarkan berapa banyak nilai pip yang berbeda.

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

Beranotasi:

->*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]
}
Bukan itu Charles
sumber
3

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

* sekarang melewati 'sixes' * terima kasih kepada Ben Frankel karena telah menghemat 46 Bytes!


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

Cobalah online!

Terima kasih untuk tantangan pertama yang keren!

Stephen
sumber
1
Beberapa saran bermain golf whitespace: TIO
math junkie
Terima kasih! Saya tahu ruang putih menambahkan banyak byte tetapi saya pikir itu membutuhkan 4 ruang. Diedit! @math_junkie
Stephen
@ user7686415 Atau Anda bisa menggunakan tab yang sebenarnya.
mbomb007
1
@NotthatCharles memperbaikinya!
Stephen
1
@Stephen, Tentu. D.get(a, b)berarti mengakses nilai dalam dikt D pada kunci a, dengan nilai default b jika kunci tidak ditemukan. Itu sama dengan menulis D[a] if a in D else b, yang sama dengan menulis D[a] if a in D.keys() else b.
Ben Frankel
2

PHP, 413 405 398 409 408 406 398 byte

Sayangnya, PHP tidak mendukung referensi array bersarang di dalam string;
yang akan menyelamatkan 6 5 byte lagi.

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;

Jalankan dengan echo <hand> | php -nR '<code>atau coba online .

kerusakan

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
;

Membutuhkan PHP> = 5.6 (untuk e[...])

Titus
sumber
1
ini mungkin gagal "sixes"
Bukan berarti Charles
1
@NotthatCharles: Harganya 11 byte ... tapi saya pegolf kembali. :)
Titus
1

Python 2 - 583 byte

Saya terlalu baru untuk dapat mengomentari posting, jadi saya hanya memposting versi saya dari python solusion.

Memperbaiki masalah dengan 'es' untuk pasangan dan tiga dari enam. Terima kasih bukan pada Charles

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

Sedikit lebih mudah dibaca dengan beberapa komentar

# 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
Possum Mati
sumber
Juga dapat berubah di baris terakhir j=0; if [z]*3==v:r="three %ss"%i(z)ke if [z]*3==v:r="three %ss"%d[z][0]Tapi itu menghemat hanya 1 byte
Dead Possum
1
ini mungkin gagal "sixes"
Bukan berarti Charles
1
@NotthatCharles Ya, terima kasih telah memperhatikan. Saya telah menambahkan fix
Dead Possum