Đặt tên cho bàn tay khoe khoang


11

Lý lịch

Brag là một trò chơi bài tương tự về khái niệm, nhưng đơn giản hơn, poker. Một tay trong khoe khoang bao gồm ba thẻ và được xếp hạng như sau từ cao nhất đến thấp nhất:

  • Ba loại một - tất cả ba thẻ cùng cấp. Được đặt tên là "ba vị vua", v.v.

  • Chạy tuôn hay còn gọi là xả thẳng. Tất cả ba thẻ cùng một bộ và xếp hạng liên tiếp. Bàn tay được đặt tên theo ba thẻ theo thứ tự tăng dần theo sau là các từ "bật lên" để phân biệt với một lần chạy / thẳng đơn giản, ví dụ: "ten-jack-queen on the nảy". Lưu ý ace là cao hoặc thấp nhưng không phải cả hai - "king-ace-hai" không phải là chạy.

  • Chạy aka thẳng. Như trên nhưng không có yêu cầu để phù hợp với phù hợp. Được đặt tên đơn giản là ví dụ "ten-jack-queen".

  • Flush - cả ba thẻ cùng một bộ đồ, được đặt tên theo thứ hạng cao nhất, ví dụ "Ace flush".

  • Cặp - hai thẻ cùng cấp bậc với một phần ba xếp hạng phiên bản khác. Được đặt tên là "cặp ba", vv

  • Bất kỳ sự kết hợp nào khác, được đặt tên theo thứ hạng cao nhất, ví dụ: "ace high".

Thử thách

Cho ba thẻ chơi, xuất ra tên của tay khoe họ xuất ra.

Các thẻ sẽ được nhập dưới dạng ba chuỗi 2 ký tự hoặc được nối thành một chuỗi 6 ký tự (tùy theo cách triển khai của bạn), trong đó đầu tiên của mỗi cặp là thứ hạng (2 ... 9, T, J, Q, K, A) và cái thứ hai biểu thị cho bộ đồ (H, C, D, S).

Áp dụng quy tắc chơi gôn tiêu chuẩn - viết chương trình hoặc chức năng chấp nhận đầu vào này và xuất tên của bàn tay như chi tiết ở trên.

Bạn có thể cho rằng đầu vào sẽ hợp lệ (xếp hạng và phù hợp trong phạm vi trên, không có thẻ lặp lại) và trong mọi trường hợp bạn thích, nhưng sẽ không theo bất kỳ thứ tự cụ thể nào.

Đầu ra phải là trong tất cả các chữ viết hoa, tất cả chữ thường hoặc viết hoa hợp lý, ví dụ như trường hợp tiêu đề hoặc trường hợp câu. Các cấp số nên được đánh vần, ví dụ "hàng chục" chứ không phải 10 giây.

Mẫu đầu vào & đầu ra:

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"

Đây là nỗ lực đầu tiên của tôi tại một thử thách trên trang web này, vui lòng đề xuất cải tiến nhưng hãy nhẹ nhàng :)



4
Chào mừng đến với PPCG! Tôi chỉ lướt qua thử thách cho đến nay, nhưng có vẻ tốt cho thử thách đầu tiên. Điều đó nói rằng, viết những thách thức tốt là khó và trong tương lai, trước tiên tôi khuyên bạn nên đăng ý tưởng vào hộp cát , nơi bạn có thể nhận phản hồi và cải thiện chi tiết về thông số kỹ thuật trước khi mạo hiểm bỏ phiếu, đóng phiếu và câu trả lời có thể bị vô hiệu bởi những thay đổi sau này đối với thử thách.
Martin Ender

@MartinEnder cảm ơn! Tôi chắc chắn sẽ được nhìn vào hộp cát vào lần tới.
IanF1

Chúng ta có thể nhận đầu vào là mảng của bộ dữ liệu không? Ngoài ra, chúng ta có thể rút ngắn sản lượng như 'king flush' thành 'fk' không?
Matthew Roh

1
vui lòng thêm "6D6C6S"dưới dạng một trường hợp thử nghiệm vì sáu là số nhiều lẻ
Không phải Charles

Câu trả lời:


2

Hồng ngọc, 384 , 320

Chấp nhận một mảng các chuỗi hai char.

Chuyển các giá trị pip thành giá trị hex và xác định tay dựa trên số lượng giá trị pip khác nhau.

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

Chú thích:

->*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 byte

* bây giờ vượt qua 'Sixes' * cảm ơn Ben Frankel vì đã tiết kiệm được 46 Byte!


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

Hãy thử trực tuyến!

Cảm ơn cho một thử thách đầu tiên tuyệt vời!


1
Một số gợi ý chơi gôn khoảng trắng: TIO
nghiện toán học

Cảm ơn! Tôi biết khoảng trắng được thêm rất nhiều byte nhưng tôi nghĩ nó cần 4 khoảng trắng. Đã chỉnh sửa! @math_junkie
Stephen

@ user7686415 Hoặc bạn có thể sử dụng các tab thực tế thay thế.
mbomb007

1
@NotthatCharles đã sửa nó!
Stephen

1
@Stephen, Chắc chắn rồi. D.get(a, b)có nghĩa là truy cập giá trị trong dict D tại khóa a, với giá trị mặc định b nếu không tìm thấy khóa. Nó giống như viết D[a] if a in D else b, cũng giống như viết D[a] if a in D.keys() else b.
Ben Frankel

2

PHP, 413 405 398 409 408 406 398 byte

Thật không may, PHP không hỗ trợ tham chiếu mảng lồng trong các chuỗi;
điều đó sẽ lưu thêm 6 5 byte.

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;

Chạy với echo <hand> | php -nR '<code>hoặc kiểm tra nó trực tuyến .

phá vỡ

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
;

Yêu cầu PHP> = 5.6 (cho e[...])


1
điều này có thể thất bại "Sixes"
Không phải Charles

1
@NotthatCharles: Điều đó khiến tôi mất 11 byte ... nhưng tôi đã đánh lại chúng. :)
Tít

1

Python 2 - 583 byte

Tôi còn quá mới để có thể bình luận các bài đăng, vì vậy tôi chỉ đăng phiên bản của tôi về việc giải mã trăn.

Đã sửa lỗi 'es' cho cặp và ba trong số sáu. Cảm ơn không phải 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

Một chút dễ đọc hơn với một số ý kiến

# 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

Cũng có thể thay đổi ở các hàng cuối cùng j=0; if [z]*3==v:r="three %ss"%i(z)thành if [z]*3==v:r="three %ss"%d[z][0]Nhưng nó chỉ tiết kiệm được 1 byte
Dead Possum

1
điều này có thể thất bại "Sixes"
Không phải Charles

1
@NotthatCharles Vâng, cảm ơn bạn đã chú ý. Tôi đã thêm bản sửa lỗi
Dead Possum
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.