กำหนดลูกเต๋าสามลูก (ค่าจำนวนเต็มตั้งแต่ 1-6) เรียงตามลำดับ (เพื่อแยกไม่ออก) ให้แปลงเป็นผลรวมของลูกเต๋าสองลูกที่มีการแจกแจงที่เหมือนกัน
คำตอบสำหรับสามต่อหนึ่งคือการสรุปพวกเขาทั้งหมดโมดูโล 6 ผลลัพธ์สุดท้ายคือการแจกแจงแบบแบนอย่างสมบูรณ์แบบโดยที่ตัวเลขหกตัวนั้นมีแนวโน้มเท่ากัน (เหมือนตายครั้งเดียว)
มันง่ายมากที่จะทำแบบสามต่อหนึ่งโดยการรวมโมดูโลทั้งหมด 6 ผลลัพธ์สุดท้ายคือการกระจายแบบเรียบที่สมบูรณ์แบบโดยที่ตัวเลขทั้งหกนั้นมีโอกาสเท่ากัน (เหมือนตายครั้งเดียว) ความท้าทายของคุณคือการทำแบบเดียวกันกับสามต่อสอง
แรงบันดาลใจจากเกมไขปริศนาลูกเต๋าสามขั้นที่แยกไม่ออก วิดีโอ "ติดตาม"ติดตามก็โพสต์ แต่การโต้เถียงเกี่ยวกับ "ความสง่างาม" ของทางใดทางหนึ่งเป็นเรื่องส่วนตัว การนับจำนวนตัวอักษรไม่ใช่:D
คำแนะนำ
เขียนโปรแกรมหรือฟังก์ชั่นที่ยอมรับเลขจำนวนเต็ม / ตัวเลขที่เรียงลำดับ 1-6 และส่งออกหรือส่งกลับจำนวนเต็มเดียว 2-12 เช่นนั้นสำหรับอินพุตที่เป็นไปได้ 216 รายการผลลัพธ์จะถูกกระจายเป็น:
222222
333333333333
444444444444444444
555555555555555555555555
666666666666666666666666666666
777777777777777777777777777777777777
888888888888888888888888888888
999999999999999999999999
AAAAAAAAAAAAAAAAAA
BBBBBBBBBBBB
CCCCCC
(ฉันใช้เลขฐานสิบหกเพื่อเก็บไว้ที่ตัวอักษรเดียวเอาต์พุตทศนิยมไม่เป็นไร)
เนื่องจากลูกเต๋าไม่สามารถแยกแยะได้จึงไม่มีคำสั่งที่แท้จริงให้กับพวกเขาดังนั้นอินพุตที่เรียงลำดับแล้ว คุณไม่สามารถ "ดรอปครั้งที่สาม" เพียงเพราะไม่ชัดเจน
รายละเอียด
- คะแนนคือความยาวของโปรแกรมเป็นไบต์
- โปรแกรมสามารถเป็นฟังก์ชั่นที่เรียกว่าอย่างใดหรือสคริปต์ปฏิบัติการที่อ่านจาก stdin หรืออะไรก็ตามที่มั่นใจ
- ไม่มี "rerolling" โดยรับเอนโทรปีจากแหล่งอื่น
ตัวอย่าง (และทดสอบ)
แทนที่จะทำการทดสอบความน่าจะเป็นประเภทใด ๆ ก็ง่ายพอที่จะตัดผ่านกรณี 216 (6³) ของทั้งสามลูกเต๋าและยืนยันว่าฟังก์ชันของคุณคืนค่าแต่ละค่าเท่าที่ควร มันจะถูกเรียกด้วยพารามิเตอร์ที่เหมือนกัน (เช่นกรณี1, 2, 3
และ3, 2, 1
, ... สันนิษฐานว่าแยกไม่ออกและถูกแปลง (โดยพลการ) เป็น1, 2, 3
)
ตัวอย่างคำตอบ (แรงเดรัจฉานแรงมากและไม่มีประสิทธิภาพ) และชุดทดสอบมีให้ใน Python หวังว่าบิตทดสอบจะชัดเจนพอที่จะพอร์ตกับภาษาที่คุณเลือกแม้ว่าการทำ stdin / stdout จะแตกต่างกันเล็กน้อย รหัสการทดสอบนั้นใช้สำหรับการทดสอบและไม่ได้คะแนน (แม้ว่าคุณจะต้องการให้รหัสดังกล่าวกับผู้ใช้ภาษาอื่นหรือวิธีการ I / O ของคุณอาจเป็นประโยชน์)
# 6x6 lists of numbers with digits sorted
LUT = [
[[124], [133, 166], [346], [223, 355], [256], [115, 445]],
[[233, 266], [125], [224, 455], [134], [116, 446], [356]],
[[126], [111, 333, 555, 225], [234], [144, 366], [456], [135]],
[[112, 244], [235], [334, 466], [145], [226, 556], [136]],
[[146], [122, 155], [236], [113, 344], [245], [335, 566]],
[[246], [123], [114, 336], [345], [222, 444, 666, 255], [156]],
]
def three2two(rolls):
look_for = int('{}{}{}'.format(*sorted(rolls)))
for i in range(6):
for j in range(6):
if look_for in LUT[i][j]:
return i + j + 2
# fair distribution of the sum of two dice multiplied by 6 (because each should be hit 6x)
expected_counts = {
2: 6, 12: 6,
3: 12, 11: 12,
4: 18, 10: 18,
5: 24, 9: 24,
6: 30, 8: 30,
7: 36,
}
d = [1, 2, 3, 4, 5, 6]
for i in d:
for j in d:
for k in d:
ijk = sorted([i, j, k])
result = three2two(ijk)
expected_counts[result] -= 1
for key in expected_counts:
assert expected_counts[key] == 0
(a+b+c)%6+1
และ(a*b*c)%7
แปลงลูกเต๋าที่ไม่มีการเรียงลำดับสามลูกให้เป็นม้วนเดียวที่มีรูปทรงเหมือนกัน แต่น่าเสียดายที่ไม่มีความน่าจะเป็นอิสระ