เตรียมความพร้อมที่จะตาย?


22

พื้นหลัง

แหล่งที่มาหนึ่งของความสนุกในเกมเล่นตามบทบาทบนโต๊ะคือการรับมือกับการทอยลูกเต๋า การร่ายคาถา Disintegration นั้นอาจจะเกิดขึ้นทันที แต่การกลิ้งและการรวมเข้าด้วยกัน 40 ลูกเต๋าไม่ใช่อย่างแน่นอน!

จำนวนของข้อเสนอแนะสำหรับการจัดการนี้จะมีการหารือในที่ rpg.stackexchange.com อย่างไรก็ตามบางส่วนของพวกเขาเช่นการใช้โปรแกรมโรลเลอร์หรือลูกเต๋าเฉลี่ยทำให้ความสนุกและความรู้สึกควบคุมได้จากผู้เล่น อื่น ๆ เช่นการทอยลูกเต๋า 4 ลูกและการคูณทั้งหมด 10 ทำให้ได้ผลลัพธ์ที่แกว่งไปมามากขึ้น (ในขณะที่การเฉลี่ยลูกเต๋ากระทำในทิศทางตรงกันข้าม)

คำถามนี้เกี่ยวข้องกับวิธีการลดจำนวนการทอยลูกเต๋าโดยไม่เปลี่ยนผลลัพธ์เฉลี่ย (หมายถึง) หรือความผันผวน (ความแปรปรวน)

โน้ตและคณิตศาสตร์

ในคำถามนี้เราจะใช้สัญลักษณ์ต่อไปนี้เพื่อเป็นตัวแทนของลูกเต๋า:

  • n d k (เช่น 40d6) หมายถึงผลรวมของ n ม้วนของ k-sided die
  • n d k * c (เช่น 4d6 * 10) อธิบายการคูณผลลัพธ์ด้วยค่าคงที่ c
  • นอกจากนี้เรายังสามารถเพิ่มม้วน (เช่น 4d6 * 10 + 40d6) และค่าคงที่ (เช่น 4d6 + 10)

สำหรับม้วนกระดาษเดียวเราสามารถแสดงได้ว่า:

  • ค่าเฉลี่ย : E [1d k ] = (k + 1) / 2
  • ความแปรปรวน : Var (1d k ) = (k-1) (k + 1) / 12

การใช้คุณสมบัติพื้นฐานของค่าเฉลี่ยและความแปรปรวนเราสามารถอนุมานได้ว่า:

  • หมายถึง : E [ m d k * a + n d l * b + c ] = am. E [1d k ] + bn . [1d l ] + c
  • ความแปรปรวน : Var ( m d k * a + n d l * b + c ] = a ². m.วาร์ (1d k ) + b ². n .Var (1d l )

งาน

ด้วยจำนวนเต็มสามจำนวนn , kและrโปรแกรมของคุณควรแสดงผลลัพธ์ประมาณn d kในค่าr rillsส่วนใหญ่โดยมีข้อ จำกัด ดังต่อไปนี้:

  • การแก้ปัญหาควรมีเหมือนกันค่าเฉลี่ยและความแปรปรวนเป็นn d k
  • การแก้ปัญหาควรมีจำนวนม้วนที่ใหญ่ที่สุดที่เป็นไปได้น้อยกว่าหรือเท่ากับrเนื่องจากม้วนจำนวนมากจะให้การกระจายที่ราบรื่นยิ่งขึ้น
  • คุณควร จำกัด วิธีการแก้ปัญหาเฉพาะการใช้ลูกเต๋าแบบk-ด้านเว้นแต่คุณจะตั้งเป้ารับโบนัส (ดูด้านล่าง)
  • หากไม่มีวิธีแก้ปัญหา (เนื่องจากrมีขนาดเล็กเกินไป) โปรแกรมควรส่งออกสตริง "ฉันเป็นพระเจ้าแห่งการต่อสู้อย่างเซ็กซี่!"
  • พารามิเตอร์ถูกส่งเป็นสตริงที่คั่นด้วยช่องว่างเดียว
  • คุณอาจคิดว่า 1 ≤ n ≤ 100, 1 ≤ rnและkนั้นเป็นหนึ่งใน 4, 6, 8, 10, 12 และ 20 (ลูกเต๋ามาตรฐานที่ใช้ใน tabletops)
  • เอาต์พุตควรอยู่ในรูปแบบที่อธิบายไว้ในสัญกรณ์ (เช่น 4d6 * 10 + 5) โดยมีช่องว่างเพิ่มเติมรอบ + s แต่ไม่มีที่อื่น ตัวคูณหน่วยก็เป็นทางเลือกเช่นกัน: ทั้ง 4d6 * 1 และ 4d6 นั้นถูกต้อง

คุณสามารถเขียนโปรแกรมหรือฟังก์ชั่นรับอินพุตผ่าน STDIN (หรือทางเลือกที่ใกล้เคียงที่สุด) อาร์กิวเมนต์บรรทัดคำสั่งหรืออาร์กิวเมนต์ฟังก์ชัน ควรพิมพ์ผลลัพธ์ไปที่ STDOUT (หรือตัวเลือกที่ใกล้เคียงที่สุด) หรือส่งคืนเป็นสตริง

ตัวอย่าง

>> "10 6 10"
10d6
>> "10 6 4"
2d6*2+2d6+14
>> "10 6 3"
1d6*3+1d6+21
>> "10 6 2"
1d6*3+1d6+21
>> "10 6 1"
I AM A SEXY SHOELESS GOD OF WAR!

เกณฑ์การให้คะแนน

รหัสที่สั้นที่สุดชนะ ใช้กฎมาตรฐาน

โบนัส

-33% (ปัดเศษก่อนการลบ) หากโปรแกรมของคุณส่งคืนโซลูชันที่มีลูกเต๋าที่ถูกต้องนอกเหนือจากk (ซึ่งค่าที่ถูกต้องตามที่กล่าวไว้ข้างต้นคือ 4, 6, 8, 10, 12 และ 20) หากคุณเลือกที่จะทำเช่นนั้นแล้วคุณควรเสมอกลับมาแก้ปัญหาดังกล่าวเมื่อการแก้ปัญหาที่เหมาะสมและการจัดการที่ใช้หลายประเภทของการตาย ตัวอย่าง:

>> "7 4 3"
3d6+7

6
+1 สำหรับการอ้างอิง OotS ;) (ดีและเพราะมันเป็นความท้าทายที่ดีจริง ๆ แล้ว)
Martin Ender

1
อาจใช้ความสามารถ $ \ LaTeX $ ใหม่ของเราในการตอบคำถามนี้หรือไม่
orlp

2
@UriZarfaty: ฉันอัปเดตสูตรของคุณเพื่อใช้ LaTeX หวังว่าไม่เป็นไร หากคุณไม่ชอบคุณสามารถย้อนกลับโพสต์และมันจะกลับไปเป็นก่อนหน้านี้
Alex A.

1
ผมเคยรีดกลับแก้ไขน้ำยางเพราะโชคไม่ดีที่มันจะถูกปิดการใช้งานอีกครั้งสำหรับในตอนนี้
Martin Ender

1
#SadPanda - ฉันคิดว่านี่จะเป็นการอ้างอิงรหัสที่ท้าทายสำหรับ "สวัสดีฉันชื่อ Inigo Montoya คุณฆ่าพ่อของฉันเตรียมตัวตายแล้ว"
scunliffe

คำตอบ:


5

GolfScript ( 163 143 133 ไบต์)

~@:^\?,{^base 0-}%{0\{.*+}/^=},.{{,}$-1=..&{[[1$[1$]/,(3$@]'d*+'1/]zip}%^@{-}/@)*.2/\1&'.5'*}{];'I AM A SEXY SHOELESS GOD OF WAR!'}if

การสาธิตออนไลน์

เมื่อไม่ได้ผสมลูกเต๋าปัญหาจะลดลงเป็นการแสดงnผลรวมไม่เกินrกำลังสองและkไม่เกี่ยวข้องยกเว้นการคำนวณค่าคงที่ในตอนท้าย เป็นกลุ่มของคำตอบนี้คือการทำบัญชีที่จำเป็นในการแสดงผลในรูปแบบที่ต้องการ: การคำนวณที่เกิดขึ้นจริง^\?,{^base}%{0\{.*+}/^=},ที่จะหาปัจจัยคูณa, bฯลฯ .; และ^@{-}/@)*.2/เพื่อคำนวณค่าคงที่

การผ่า

~                # Stack: n k r
@:^\?,{          # Store n in ^, and for 0 to n**r
  ^base 0-       #   convert to base n and remove 0s.
}%               # Stack: k [arrays of up to r values from 1 to n-1]
{0\{.*+}/^=},    # Filter them to arrays whose sum of squares is n,
                 #   i.e. to multipliers which have the right variance
.{               # If any multiplier array passes the filter...
  {,}$-1=        #   Pick one with the greater number of rolls
                 #   Stack: k [multipliers]
  ..&{           #   Map each distinct multiplier a...
    [[           #     Gather in nested array for later zip
      1$[1$]/,(  #       Split a copy of the multipliers around a to count the as
                 #       Let's denote that count as m
                 #       Stack: k [multipliers] a [ [ m
      3$@        #       Copy k and rotate the a inside the nested array
     ]           #       Stack: k [multipliers] [ [m k a]
      'd*+'1/    #       Push an array ['d' '*' '+'] and close nested array
    ]zip         #       Giving [[m 'd'] [k '*'] [a '+']]
                 #       which will be printed as mdk*a+
  }%             #   Stack: k [multipliers] [string representations of dice]
  ^@{-}/@)*      #   Compute (n - sum(multipliers)) * (k + 1)
                 #   That's twice the constant we need to add to fix the mean
  .2/\1&'.5'*    #   And convert it to a renderable form, including .5 if needed
}{               # Otherwise clear the stack and push the error message
  ];'I AM A SEXY SHOELESS GOD OF WAR!'
}if

1

งูหลาม 487 461 452 - 33% = 303 ไบต์

เนื่องจากไม่มีใครทำเช่นนี้ต่อไปนี้เป็นโซลูชันที่จัดการกับลูกเต๋าชนิดต่าง ๆ เช่นเดียวกับโซลูชันอื่น ๆ มันสร้างโซลูชันหลากหลายที่เป็นไปได้และกรองข้อมูลลง มันใช้ข้อเท็จจริงที่ว่า (k + 1) (k-1) = k ^ 2-1 และสอง semi-loopholes ในข้อมูลจำเพาะ (โอ๊ะโอ!): การขาดการห้ามพิมพ์แบบฟอร์มซ้ำซ้อน 0d k * a (ซึ่งช่วยประหยัด ทั้งหมด 5 ไบต์!) และการ จำกัด เวลาทำงาน (มันช้าอย่างรวดเร็วพอสมควรถึงแม้ว่าจะรันทุกตัวอย่างที่ให้มาก็ตาม)

from itertools import*
N,K,R=map(int,input().split())
S=lambda l:sum([x[0]for x in l])
s=[x for x in product(*[[(n,k,a)for n in range(N*(K**2-1)/((k**2-1)*a**2)+1)]for a in range(1,N+1)for k in[4,6,8,10,12,20]if a**2<=N])if sum([n*(k**2-1)*a**2 for n,k,a in x])==N*K**2-N and S(x)<=R]
if s:s=max(s,key=S);print"+".join(["%sd%s*%s"%x for x in s]+[str(int(N*(K+1)/2.-sum([n*a*(k+1)/2.for n,k,a in s])))])
else:print"I AM A SEXY SHOELESS GOD OF WAR!"

สำหรับเอาต์พุตที่สวยเพิ่มเพิ่มif x[0]หลังจาก"%sd%s*%s"%x for x in s:

>> "7 4 3"
3d6+7
>> "10 6 3"
1d6*1+1d8*1+1d8*2+18
>> "10 6 2"
1d6*1+1d6*3+21
>> "10 6 1"
I AM A SEXY SHOELESS GOD OF WAR!
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.