สุดยอดยาห์ซี่


26

Yahtzee เป็นเกมที่เล่นด้วยลูกเต๋าหกด้านห้าแผ่นและแผ่นคะแนนที่มีสิบสามกล่องเพื่อเติมคะแนนในแต่ละกล่องมีกฎการให้คะแนนของตัวเอง:

  • 1s, 2s, 3s, 4s, 5s, 6s คะแนนทุกคะแนนเท่ากับผลรวมของลูกเต๋าตามลำดับ (นั่นคือการหมุนของ [3, 2, 3, 1, 5] คะแนนที่ 3s จะได้รับ 6 คะแนน: 3 สำหรับแต่ละ 3)
  • 3-of-a-kind และ 4-of-a (ขณะที่พวกเขาฟังสามหรือสี่ลูกเต๋ากลิ้งเหมือนกัน) คะแนนคะแนนเท่ากับผลรวมของห้าลูกเต๋าทั้งหมด
  • Full house (สองลูกเต๋าแสดงค่าหนึ่งค่าอีกสามแสดงอีก) คะแนน 25 คะแนน
  • เส้นตรงขนาดเล็ก (ค่าสี่ค่าติดต่อกัน) ให้คะแนน 30 คะแนน
  • เส้นตรงขนาดใหญ่ (ค่าติดต่อกันทั้งหมด) ได้คะแนน 40 คะแนน
  • Yahtzee (ลูกเต๋าทั้งหมดแสดงค่าเดียวกัน) ได้ 50 คะแนน

ที่สิบสาม (โอกาส) ทำให้รู้สึกในเกม แต่ไม่มากสำหรับความท้าทายนี้ นอกจากนี้เกมมีโบนัสสำหรับ Yahtzees พิเศษซึ่งไม่สมเหตุสมผลที่นี่ เพราะความท้าทายคือ ...

เมื่อได้รับห้าลูกเต๋าเป็นอินพุต (จำนวนเต็ม 1-6 ห้าตัวอย่างไรก็ตามอินพุตสะดวกคุณสามารถสมมติว่าอินพุตถูกต้องเสมอ) ส่งออกคะแนนสูงสุดที่เป็นไปได้สำหรับ 'มือ' สำหรับจุดประสงค์ของการท้าทายนี้เฉพาะวิธีการให้คะแนนในรายการด้านบนเท่านั้นที่ถูกต้อง (โดยเฉพาะโอกาสไม่ใช่กล่องคะแนนที่ถูกต้องสำหรับการท้าทายนี้) คะแนนควรถูกส่งออกเป็นค่าตัวเลขทศนิยมไม่ว่าจะเป็นจำนวนเต็มหรือการแทนค่าสตริง ควรจำได้ทันทีว่าเป็นตัวเลข ช่องว่างนำหน้า / ต่อท้ายเป็นเรื่องปกตินี่เป็นเรื่องเกี่ยวกับการได้รับคะแนนไม่ใช่การนำเสนอ

โค้ดกอล์ฟดังนั้นคำตอบที่มีจำนวนไบต์น้อยที่สุดในภาษาที่กำหนดจะชนะ ช่องโหว่มาตรฐานต้องห้าม

กรณีทดสอบ

(หมายเหตุว่าสิ่งเหล่านี้มีความเป็นอิสระทุกความท้าทายคือการให้คะแนนหนึ่ง 'มือ' ของลูกเต๋า):

in: 1 5 4 3 2
out: 40
in: 1 1 4 3 1
out: 10
in: 2 2 6 5 3
out: 6
in: 2 4 2 4 6
out: 8
in: 1 1 1 1 1
out: 50
in: 5 2 5 3 6
out: 10
in: 1 6 3 4 2
out: 30
in: 1 3 1 1 3
out: 25
in: 6 5 5 6 6
out: 28
in: 1 2 3 5 6
out: 6

3
เราควรปิดคำถามเก่าแทนไหม IMO นี่เป็นคำถามที่ดีกว่าคำถามนั้น ...
Giuseppe

5
IMO นี้ไม่ได้ซ้ำกับคะแนนของเกมของ yahtzee สิ่งนี้ระบุอย่างชัดเจนว่ามันเป็นคะแนนสูงสุดสำหรับมือเดียวซึ่งคำถามอื่น ๆ จะขอคะแนนทั้งหมดจากรายการของม้วนตาย สุดท้ายและที่สำคัญที่สุดฉันไม่เห็นคำตอบใด ๆ จากผู้ล่อที่เป็นไปได้ที่สามารถใช้ที่นี่ในสถานการณ์ "คัดลอกแปะ" โปรดพิจารณาเปิดใหม่
กำลังพัฒนาผู้พัฒนา


2
FWIW ฉันตระหนักถึงคำถามที่เก่ากว่าเมื่อฉันรวบรวมคำถามนี้เข้าด้วยกัน ความคิดของฉันสะท้อนสิ่งที่ @DevelopingDeveloper พูด ก่อนหน้านี้ฉันเคยทำแบบฝึกหัดนี้ฉันพบโอกาสที่น่าสนใจในการปรับกระบวนการนี้ ฉันแค่คิดว่านี่เป็นความท้าทายที่เป็นระเบียบมากขึ้น
brhfl

"สิบสาม (โอกาส) ทำให้รู้สึกในเกม แต่ไม่มากสำหรับความท้าทายนี้" มันจะนับหรือไม่
Unihedron

คำตอบ:


6

R , 146 141 ไบต์

function(d)max(unique(d<-sort(d))*(g=table(d)),any(g>2)*sum(d),all(2:3%in%g)*25,(s=sum((R=diff(d))==1))<4&all(R<2)*30,(s>3)*40,(0==sd(d))*50)

ลองออนไลน์!

โต้งโดย plannapus

รับอินพุตเป็นรายการและส่งคืนคะแนน

ungolfed เล็กน้อย:

function(d){
 d <- sort(d)
 u <- unique(d)                  # unique dice
 g <- table(d)                   # table of counts
 Ns <- u*g                       # scores as 1s, 2s, ... etc.
 NKind <- any(g>2)*sum(d)        # 3 or 4 of a kind if any counts are at least 3
 FHouse <- all(2:3%in%g)*25      # full house is 25 if 2 & 3 are in counts
 R <- diff(d)                    # consecutive differences
 s <- sum(R==1)                  # sum of differences equal to 1
 sStraight <- s<4 &              # if the number of 1s is 3 and
               all(R<2)*30       # no consecutive numbers are 2 apart
 bStraight <- (s>3)*40           # all 1s means big straight
 Yahtzee <- sd(d)==0             # sd = 0 means all are equal
 max(Ns,NKind,FHouse,sStraight,bStraight,Yahtzee)
}


f(c(1,2,3,5,6))ล้มเหลว - ควรให้ 6 และแทนที่จะให้ 30 แทนดูเหมือนว่านี่เป็นเพราะคุณนับจำนวนคู่ (การเรียงลำดับหลัง) แตกต่างกันหนึ่งอันซึ่งอันที่จริงแล้วสี่สำหรับลำดับข้างต้นถึงแม้ว่ามันจะไม่ตรง ของสี่ ผมคิดว่าผมวิ่งเข้าไปในนี้เมื่อฉันทำอย่างนี้เป็นการออกกำลังกายในขณะที่กลับและฉันอาจจะเพิ่มว่าเป็นกรณีทดสอบ ...
brhfl

@brhfl สิ่งนี้ได้รับการแก้ไขแล้ว
Giuseppe


4

R, 136 134 ไบต์

function(n,y=table(factor(n,1:6)),z=sum(!diff(diff(sort(n)))))max(1:6*y,c(25,sum(n),10*3:5)[c(all(y<4&y-1),any(y>2),z>1,z>2,any(y>4))])

ลดขนาดลง 2 ไบต์ด้วย@Giuseppe !

เยื้อง

function(n, #vector of die scores
         y=table(factor(n,1:6)), #Contingency table
         z=sum(!diff(diff(sort(n))))) #Diff of diff of ordered scores
    max(1:6*y,
        c(25,sum(n),10*3:5)*c(all(y<4&y-1), #Full house
                            any(y>2), #3 and 4 of a kind
                            z>1, #Small straight
                            z>2, #Long straight
                            any(y>4))] #Yahtzee

กรณีทดสอบสองสามข้อ:

> f=function(n,y=table(factor(n,1:6)),z=sum(!diff(diff(sort(n)))))max(1:6*y,c(25,sum(n),10*3:5)*c(all(y<4&y-1),any(y>2),z>1,z>2,any(y>4)))
> f(c(2,4,2,4,6))
[1] 8
> f(c(1,2,3,5,6))
[1] 6
> f(c(6,5,5,6,6))
[1] 28
> f(c(6,5,3,1,4))
[1] 30
> f(c(6,5,3,2,4))
[1] 40

1
หืมฉันคิดว่าเดี๋ยวก่อนจะfactorร้อน แต่ฉันคิดว่าถ้าฉันใช้วิธีการของคุณด้วยz( sในคำตอบของฉัน) ฉันสามารถตีกอล์ฟลงไปที่ 134 ...
Giuseppe

นอกจากนี้คุณสามารถบันทึกสามไบต์โดยใช้all(y<4&y-1)และใช้*แทน[และตั้งค่าyอินไลน์แทนที่จะเป็นอาร์กิวเมนต์ของฟังก์ชันและมันยังผ่านกรณีทดสอบทั้งหมด: ลองออนไลน์!
Giuseppe

นอกจากนี้ฉันปรับโครงสร้างmaxและฉันคิดว่ามันช่วยไบต์จากการตั้งค่าyแบบอินไลน์
Giuseppe

3

แบตช์ 359 ไบต์

@echo off
set/at=s=m=r1=r2=r3=r4=r5=r6=0
for %%r in (%*)do set/a"m+=!(m-r%%r),r%%r+=1,t+=%%r,p=s-r%%r*%%r,p&=p>>9,s-=p
goto %m%
:1
if %r1% neq %r6% set s=40&goto g
:2
set/at=r3*r4*(r2*(r1+r5)+r5*r6)
if %t% gtr 0 set s=30
goto g
:3
set/a"s=r1^r2^r3^r4^r5^r6"
if %s%==1 if %t% lss 25 set s=25&goto g
:4
set/as=t
goto g
:5
set s=50
:g
echo %s%

คำอธิบาย:

@echo off
set/at=s=m=r1=r2=r3=r4=r5=r6=0
for %%r in (%*)do set/a"m+=!(m-r%%r),r%%r+=1,t+=%%r,p=s-r%%r*%%r,p&=p>>9,s-=p
goto %m%

คำนวณจำนวนของลูกเต๋าสำหรับแต่ละหมายเลขบวกสูงสุดรวมกับผลรวมของลูกเต๋าทั้งหมดบวกผลรวมสูงสุดของลูกเต๋าที่มีหมายเลขเดียวกัน

:1
if %r1% neq %r6% set s=40&goto g

หากลูกเต๋าทั้งหมดแตกต่างกันนี่อาจเป็นเส้นตรงที่ยาว แต่ก็จำเป็นต้องมีไม่1หรือไม่6ก็ได้

:2
set/at=r3*r4*(r2*(r1+r5)+r5*r6)
if %t% gtr 0 set s=30
goto g

ไม่เช่นนั้นหรือถ้าหากอย่างน้อยสองลูกเต๋าเหมือนกันก็อาจจะเป็นเส้นตรง ต้องมีอย่างน้อย a 3และ a 4และรวมกันของตัวเลขสี่ตัวอื่น ๆ

:3
set/a"s=r1^r2^r3^r4^r5^r6"
if %s%==1 set s=25&goto g

3^2==1หากมีสามลูกเต๋าเดียวกันตรวจสอบบ้านครบวงจรตั้งแต่ อย่างไรก็ตามบ้านบางหลังเช่น 6s และ 5s มีคะแนนสูงกว่าแบบบ้าน 3 แบบ

:4
set/as=t
goto g

มิฉะนั้นหรือถ้ามีสี่ตัวที่เหมือนกันให้ทำคะแนนรวม

:5
set s=50

และถ้ามีห้าตัวเหมือนกันล่ะก็ Yahtzee!

:g
echo %s%

เอาท์พุทคะแนนที่ดีที่สุด


1
ขอบคุณที่เตือนฉันถึงศักยภาพที่อาจเกิดขึ้นได้ [5,5,6,6,6] - ได้คะแนนเต็มเหมือนบ้านเต็ม - ฉันได้เพิ่มนี่เป็นกรณีทดสอบ ฉันรู้ว่ามีบางกรณีแปลก ๆ ที่ฉันลืมไป
brhfl

3

เยลลี่ , 58 ไบต์

ċЀ`Ṁ>2ȧS
ṢI=1Ạµ-ƤẸ,E;ṢI$E$;⁸Lƙ`Ṣ⁼2,3¤a3,5,4,2.Ṁ×⁵»Ç»Sƙ`Ṁ$

ลองออนไลน์!


มันถูกต้องสมบูรณ์แบบ แต่ฉันอยากรู้อยากเห็นและไม่รู้จักเจลลี่ดีพอที่จะเอามันออกมาด้วยตัวเอง ... ทำไมกลับบ้านเต็ม25.0ในขณะที่กรณีอื่นไม่มีร่องรอย.0?
brhfl

@brhfl ดีเพราะมันอนุมานว่าเป็น2.5 × 10 = 25.0(เลขคณิตลอย) ในขณะที่คนอื่น ๆ เช่น30จะอนุมานว่าเป็น3 × 10 = 30(เลขคณิตจำนวนเต็ม)
Erik the Outgolfer

2
ขอบคุณ! ฉันตอบคำถามไม่ดี ฉันสงสัยมากขึ้นว่าคุณใช้วิธีใดในการตรวจสอบบ้านเต็มรูปแบบที่ส่งผลให้คณิตศาสตร์แตกต่างไปจากเดิม แต่ตอนนี้ฉันคิดแล้วฉันเดาว่ามันเป็นเพียงนักกอล์ฟที่จะทำ 2.5, 3, 4, 5 * 10 vs 25, 30, 40, 50. ฉันคิดว่าฉันตอบคำถามของฉันเอง
brhfl

@brhfl แน่นอนเนื่องจาก× 10มี 2 ​​ไบต์2.5เป็น 2 ไบต์เหมือน25และ3,5,4บันทึก 3 ไบต์ขึ้นไป30,50,40ดังนั้น 3 + 0 - 2 = 1 ไบต์บันทึก
Erik the Outgolfer

2

Perl 6 , 159 ไบต์

->\b{max map {$_(b)},|(1..6).map({*{$_}*$_}),{.kxxv.sum*?.values.grep(*>2)},{25*(6==[*]
.values)},30*?*{3&4&(1&2|2&5|5&6)},40*?*{2&3&4&5&(1|6)},50*(*.keys==1)}

ลองออนไลน์!

เนื่องจากอินพุตอาจได้รับการยอมรับ "แต่สะดวก" ฟังก์ชั่นของฉันใช้เป็นอินสแตนซ์ของBagคลาสซึ่งเป็นคอนเทนเนอร์ที่มีหลายหลาก A Bagยังเป็นคอนเทนเนอร์เชื่อมโยง $bag{$key}คืนค่าจำนวนครั้งที่$keyเกิดขึ้นในถุง

ส่วนใหญ่ของฟังก์ชั่นเป็นเพียงรายการของฟังก์ชั่นที่ประเมินแต่ละมือ Yahtzee ที่เป็นไปได้กลับคะแนนสำหรับมือนั้นหรือศูนย์ถ้าเงื่อนไขสำหรับมือที่ไม่เป็นไปตาม

  • |(1..6).map({ *{$_} * $_ })เป็นรายการของฟังก์ชั่นหกอย่างที่ประเมินมือโดยอิงจากการวิ่งซ้ำของตัวเลข 1-6 ผู้นำนำ|แบนรายการนี้ลงในรายการโดยรอบ
  • {.kxxv.sum * ?.values.grep(* > 2) }ประเมินมือ 3- และ 4-of-a-kind .kxxvในการBagส่งคืนกุญแจที่ทำซ้ำกับความซ้ำซ้อนของแต่ละคนการกู้คืนรายชื่อต้นฉบับของม้วนฟิล์มและ.sumแน่นอนว่าผลรวมของลูกเต๋า ผลรวมนั้นคูณด้วยค่าบูลีน ( ?) ซึ่งเป็นจริงถ้ากระเป๋า.values(กล่าวคือหลายหลาก) มีค่ามากกว่า 2
  • { 25 * (6 == [*] .values) }ประเมินแฮนด์เฮ้าส์แบบเต็ม 25 ถูกคูณด้วยค่าบูลีนซึ่งเป็นจริงหากผลคูณของ 6 เป็น 6 ซึ่งสำหรับห้าลูกเต๋าสามารถเกิดขึ้นได้หากหนึ่งคือ 3 และอีก 2 เป็น
  • 30 * ?*{ 3 & 4 & (1 & 2 | 2 & 5 | 5 & 6) }ประเมินมือตรงที่มีขนาดเล็ก มันเป็นWhateverCodeฟังก์ชั่น ดาวที่สองคือ* Bagนิพจน์ระหว่างเครื่องหมายปีกกาคือจุดเชื่อมต่อของค่า 3 และ 4 และ 1 และ 2, หรือ 2 และ 5, หรือ 5 และ 6 ค้นหาการแยกนี้ในBagผลลัพธ์ในการเชื่อมต่อของ multiplicities ที่สอดคล้องกัน ถ้า mulitplicities ของ 3 และ 4 และอย่างน้อยหนึ่งใน 1 และ 2 หรือ 2 และ 5 หรือ 5 และ 6 ไม่ใช่ศูนย์ทางแยกเป็นจริงเมื่อถูกบังคับให้บูลีน (กับ?) และบูลีนนี้ถูกคูณด้วย 30 เพื่อรับคะแนน
  • 40 * ?*{ 2 & 3 & 4 & 5 & (1 | 6) }ประเมินมือตรงที่มีขนาดใหญ่เช่นเดียวกัน มันง่ายกว่าเพราะลูกเต๋าจะต้องรวมตัวเลขแต่ละตัว 2-5 และทั้ง 1 หรือ 6
  • 50 * (*.keys == 1)ประเมินมือ Yahtzee มันเป็นเพียงค่าบูลีน 50 เท่าซึ่งเป็นจริงถ้าจำนวนของลูกเต๋าที่แตกต่างกันเป็นหนึ่ง

2

Pip , 65 63 ไบต์

n:_NgM\,6MXn*\,6AL[2<MXn23=JSNn3<Y#MX Jn^0MXn=5]*[$+g25--y*t50]

นำลูกเต๋าเป็นอาร์กิวเมนต์บรรทัดรับคำสั่งห้าข้อ ลองออนไลน์!

คำอธิบาย Ungolfed +

(นี่เป็นรุ่นดั้งเดิม)

                    g is list of cmdline args; t is 10 (implicit)

Y                   Yank into y:
  _Ng                function that counts occurrences of its argument in g
 M                   mapped to
  \,6                inclusive range from 1 to 6
                    This gives us how many dice are showing each number 1-6

s:                  Assign to s:
  # MX               length of max of
      Jy ^ 0         join y into string and split on zeros
                    This gives us the length of the longest straight

MX                  Max of
   y * \,6           each die frequency in y, times its value
 AL                  to which list append
   [                 this list:
                      3- and 4-of-a-kind:
    MXy > 2 & $+g      If max frequency is 3 or more, sum of g (else 0)
                      Full house:
    23 = J SNy & 25    Sort y and join into string; if it's 000023, 25 (else 0)
                      Straights:
    s > 3 & --s*t      If s is 4 or more, (s-1)*10 (else 0)
                      Yahtzee:
    MXy = 5 & 50       If max frequency is 5, 50 (else 0)
   ]
                    The result of the last expression is autoprinted

1

ทับทิมขนาด 184 ไบต์

โปรแกรมเต็มรูปแบบ เพื่อให้ง่ายต่อการทดสอบอินพุตให้เพิ่มส่วน$/=' 'บนเพื่ออ่านในรูปแบบ "ดิจิตคั่นด้วยช่องว่าง" (191 ตัวอักษร)

a=$<.map &:to_i
b=a.|c=[]
d=(1..6).map{|x|e=a.count x
c<<x*e
e}
e=a.sum
p !b[1]?50:b[4]&&!(a&[1,6])[1]?40:(1..3).any?{|x|(a&[*x..x+3])[3]}?30:(d-[0,2,3])[0]?d.max>2?e:c.max: [25,e].max

ฉันกำหนดให้มีการหยุดกั้นสิ่งกีดขวาง 200 ไบต์และฉันสามารถทำลายมันได้ด้วยการเหลืออีกสิบไบต์อย่างง่ายดาย!

ลองออนไลน์!

คำอธิบาย

ไม่ใช่สิ่งที่ดีมาก หวังว่าคุณจะมีความรู้เกี่ยวกับทับทิม

a=$<.map &:to_i # a: input as [number]*5
b=a.|c=[]       # c: [], b: a.uniq
d=(1..6).map{|x|
    e=a.count x # e: occurrence count in a 
    c<<x*e      # add (number * occurrence count) to c
    e           # return value in d
}
e=a.sum         # e: sum of input
p !b[1] ? 50 :  #   condition to print 50 <= if a.uniq has length 0 (el 1 is nil)
  b[4] &&       #   condition to print 40 <= if a.uniq has length 5 (el 4 exists)
  !(a&[1,6])[1] ? 40 : # <- arr & [mask]  # and a does not have both 1 and 6
  (1..3).any?{|x| # condition to print 30 <= if any of 1..4, 2..5, 3..6
  (a&[*x..x+3])[3]} ? 30 : # [3] to assert entire mask is found in a
  (d-[0,2,3])[0] ? # if, after removing 0 (not found) 2 (a pair) 3 (a triple)
                   # and something is found, this is not full house
  d.max > 2 ?   # is triple / quadruple ?
     e :        # weakly dominating alternatives
     c.max      # choose best by-suit
  : [25,e].max  # choose best by-score
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.