ตั้งชื่อโม้มือ


11

พื้นหลัง

Brag เป็นเกมไพ่ที่มีแนวคิดคล้ายกัน แต่ง่ายกว่าโป๊กเกอร์ ไพ่ในมือประกอบด้วยไพ่สามใบและมีการจัดอันดับดังนี้จากสูงไปต่ำสุด:

  • ไพ่สามใบ - ไพ่สามใบเรียงลำดับเดียวกัน ตั้งชื่อเป็น "Three Kings" ฯลฯ

  • การเรียกใช้ flush หรือที่เรียกว่า flush แบบตรง ไพ่ทั้งสามใบที่มีชุดเดียวกันและมีลำดับติดกัน ไพ่ในมือเรียงตามลำดับจากน้อยไปมากตามด้วยคำว่า "ที่เด้ง" เพื่อแยกความแตกต่างจากการวิ่ง / ตรงเช่น "สิบแจ็ค - ราชินีในการเด้ง" หมายเหตุเอซมีค่าสูงหรือต่ำ แต่ไม่ใช่ทั้งคู่ - "king-ace-two" ไม่ใช่การวิ่ง

  • เรียกใช้ตรงไปตรงมา ข้างต้น แต่ไม่มีข้อกำหนดในการจับคู่ชุดสูท ตั้งชื่อง่ายๆเช่น "ten-jack-queen"

  • ฟลัช - ไพ่ทั้งสามใบในชุดเดียวกันตั้งชื่อตามอันดับสูงสุดเช่น "Ace flush"

  • คู่ - ไพ่สองใบที่มีอันดับเดียวกันพร้อมกับหนึ่งในสามของอันดับรุ่นอื่น ชื่อเป็น "คู่ของสาม" เป็นต้น

  • ชุดค่าผสมอื่น ๆ ตั้งชื่อตามอันดับสูงสุดเช่น "ace high"

ท้าทาย

เมื่อเล่นไพ่สามใบให้เอาชื่อโหนมือที่ออกมา

ไพ่จะถูกป้อนเป็นสตริงสองตัวอักษร 3 ตัวหรือต่อกันเป็นสตริง 6 ตัวเดียว (แล้วแต่จำนวนใดก็ตามที่คุณต้องการ) ซึ่งอันดับแรกของแต่ละคู่คืออันดับ (2 ... 9, T, J, Q, K, A) และชุดที่สองหมายถึงชุดสูท (H, C, D, S)

ใช้กฎมาตรฐานการตีกอล์ฟ - เขียนโปรแกรมหรือฟังก์ชั่นที่ยอมรับอินพุตนี้และส่งชื่อของมือตามรายละเอียดด้านบน

คุณสามารถสันนิษฐานได้ว่าอินพุตนั้นถูกต้อง (จัดอันดับและเหมาะสมในช่วงข้างต้นไม่มีการ์ดซ้ำ) และในกรณีใด ๆ ก็ตามที่คุณต้องการ แต่จะไม่เรียงตามลำดับใด ๆ

ผลลัพธ์จะต้องเป็นตัวพิมพ์ใหญ่ทั้งหมดตัวพิมพ์เล็กทั้งหมดหรือตัวพิมพ์ใหญ่ที่เหมาะสมเช่นตัวพิมพ์ชื่อเรื่องหรือตัวพิมพ์ประโยค อันดับตัวเลขควรถูกสะกดเช่น "สิบ" ไม่ใช่ 10s

ตัวอย่างอินพุตและเอาต์พุต:

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"

นี่เป็นความพยายามครั้งแรกของฉันที่จะมีความท้าทายในเว็บไซต์นี้โปรดแนะนำการปรับปรุง แต่ต้องอ่อนโยน :)



4
ยินดีต้อนรับสู่ PPCG! ฉันได้ผ่านความท้าทายไปแล้วเท่านั้น แต่มันก็ดูดีสำหรับการท้าทายครั้งแรก ที่กล่าวว่าการเขียนความท้าทายที่ดีนั้นยากและสำหรับอนาคตฉันขอแนะนำให้โพสต์ความคิดในกล่องทรายก่อนที่คุณจะได้รับข้อเสนอแนะและปรับปรุงรายละเอียดของข้อกำหนดก่อนที่จะเสี่ยง downvotes ปิดการโหวตและคำตอบที่อาจ ท้าทาย.
Martin Ender

@ มาร์ตินเอนเดอร์ขอบคุณ! ฉันจะดูกล่องทรายครั้งหน้าแน่นอน
IanF1

เราสามารถรับอินพุตเป็นอาร์เรย์ของ tuples ได้ไหม นอกจากนี้เราสามารถตัดทอนผลลัพธ์เช่น 'king flush' เป็น 'fk' ได้หรือไม่
Matthew Roh

1
โปรดเพิ่ม"6D6C6S"เป็นกรณีทดสอบเนื่องจากหกเป็นพหูพจน์แปลก
ไม่ใช่ว่า Charles

คำตอบ:


2

ทับทิม, 384 , 320

ยอมรับอาร์เรย์ของสตริงสองอักขระ

แปลค่า pip เป็นค่าฐานสิบหกและระบุมือตามจำนวนค่า pip ที่แตกต่างกัน

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

ข้อเขียน:

->*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 ไบต์

* ตอนนี้ผ่าน 'sixes' * ขอบคุณ Ben Frankel ที่ช่วยประหยัด 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

ลองออนไลน์!

ขอบคุณสำหรับความท้าทายแรกสุดเจ๋ง!


1
ข้อเสนอแนะการเล่นกอล์ฟในพื้นที่ว่าง: TIO
คณิตศาสตร์ junkie

ขอบคุณ! ฉันรู้ว่าพื้นที่สีขาวกำลังเพิ่มจำนวนมากของไบต์ แต่ฉันคิดว่ามันต้องมี 4 ช่องว่าง แก้ไข! @math_junkie
Stephen

@ user7686415 หรือคุณสามารถใช้แท็บจริงแทน
mbomb007

1
@NotthatCharles แก้ไขมัน!
Stephen

1
@ สตีเฟ่นแน่นอน D.get(a, b)หมายถึงการเข้าถึงค่าใน dict D ที่คีย์ a โดยมีค่าดีฟอลต์ b หากไม่พบคีย์ ก็เหมือนกันกับการเขียนซึ่งเป็นเช่นเดียวกับการเขียนD[a] if a in D else b D[a] if a in D.keys() else b
Ben Frankel

2

PHP, 413 405 398 409 408 406 398 ไบต์

น่าเสียดายที่ PHP ไม่สนับสนุนการอ้างอิงอาร์เรย์แบบซ้อนภายในสตริง
ที่จะบันทึกอีก6 5 ไบต์

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;

ทำงานด้วยecho <hand> | php -nR '<code>หรือทดสอบออนไลน์

ทำให้พังถล่ม

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> = 5.6 (สำหรับe[...])


1
สิ่งนี้อาจล้มเหลว "sixes"
ไม่ใช่ว่า Charles

1
@NotthatCharles: ฉันมีค่าใช้จ่าย 11 ไบต์ ... แต่ฉันตีกลับมา :)
ติตัส

1

Python 2 - 583 ไบต์

ฉันใหม่เกินไปที่จะสามารถแสดงความคิดเห็นโพสต์ดังนั้นฉันเพิ่งโพสต์ solusion หลามรุ่นของฉัน

แก้ไขปัญหาด้วย 'es' สำหรับคู่และสามในหก ขอบคุณที่ไม่ใช่ชาร์ลส์

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

อ่านง่ายขึ้นเล็กน้อยเมื่อมีความคิดเห็น

# 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

อาจมีการเปลี่ยนแปลงในแถวสุดท้ายj=0; if [z]*3==v:r="three %ss"%i(z)เป็นif [z]*3==v:r="three %ss"%d[z][0]แต่จะช่วยประหยัดเพียง 1 ไบต์
Dead Possum

1
สิ่งนี้อาจล้มเหลว "sixes"
ไม่ใช่ว่า Charles

1
@NotthatCharles ใช่ขอบคุณสำหรับการสังเกต ฉันได้เพิ่มการแก้ไข
Dead Possum
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.