Cho ba cuộn xúc xắc (giá trị nguyên từ 1-6) theo thứ tự được sắp xếp (để không thể phân biệt), chuyển đổi chúng thành tổng của hai con xúc xắc công bằng với phân phối giống hệt nhau.
Câu trả lời cho ba đến một là tổng hợp tất cả, modulo 6. Kết quả cuối cùng là một phân phối hoàn toàn bằng phẳng, trong đó mỗi sáu số có khả năng như nhau (giống như một lần chết).
Thật dễ dàng để làm điều này thành ba đối một, bằng cách tổng hợp tất cả chúng theo modulo 6. Kết quả cuối cùng là một phân phối hoàn toàn bằng phẳng, trong đó mỗi sáu số đều có khả năng như nhau (giống như một lần chết). Thử thách của bạn là làm tương tự cho ba đến hai.
Lấy cảm hứng từ Ba câu đố súc sắc không thể phân biệt của standupmath . Một video "giải pháp" tiếp theo cũng đã được đăng, nhưng tranh luận về "sự thanh lịch" của cách này hay cách khác là một chút chủ quan. Đếm các ký tự không.:D
Hướng dẫn
Viết chương trình hoặc hàm chấp nhận ba số nguyên / chữ số được sắp xếp , 1-6 và xuất ra hoặc trả về một số nguyên duy nhất, 2-12, như vậy, đối với 216 đầu vào có thể, các đầu ra được phân phối như sau:
222222
333333333333
444444444444444444
555555555555555555555555
666666666666666666666666666666
777777777777777777777777777777777777
888888888888888888888888888888
999999999999999999999999
AAAAAAAAAAAAAAAAAA
BBBBBBBBBBBB
CCCCCC
(Tôi đã sử dụng hex để giữ các ký tự đơn; đầu ra thập phân vẫn ổn)
Bởi vì xúc xắc không thể phân biệt, không có thứ tự nội tại đối với chúng, do đó đầu vào được sắp xếp. Bạn không thể đơn giản "thả người thứ ba" vì điều đó sẽ mơ hồ.
Chi tiết
- Điểm là độ dài của chương trình tính bằng byte
- Chương trình có thể là một chức năng được gọi bằng cách nào đó hoặc tập lệnh thực thi đọc từ stdin hoặc bất cứ thứ gì có liên quan.
- Không "rerolling" bằng cách lấy entropy từ một nguồn khác
Ví dụ (và kiểm tra)
Thay vì thực hiện bất kỳ loại thử nghiệm xác suất nào, thật dễ dàng để xử lý các trường hợp 216 (6) của cả ba con xúc xắc và khẳng định rằng hàm của bạn trả về mỗi giá trị nhiều lần. Nó sẽ được gọi với các tham số giống hệt nhau (ví dụ: các trường hợp 1, 2, 3và 3, 2, 1, ... được cho là không thể phân biệt và được (tùy ý) chuyển đổi thành 1, 2, 3).
Một câu trả lời ví dụ (cực kỳ mạnh mẽ và không hiệu quả) và bộ kiểm tra được cung cấp dưới đây trong Python. Hy vọng rằng các bit kiểm tra đủ rõ ràng để chuyển sang ngôn ngữ bạn chọn, mặc dù thực hiện stdin / stdout sẽ khác một chút. Mã kiểm tra chỉ để thử nghiệm và không được tính điểm (mặc dù nếu bạn muốn cung cấp mã này cho những người dùng ngôn ngữ hoặc phương pháp I / O khác của bạn, điều đó có thể hữu ích).
# 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+1và (a*b*c)%7chuyển đổi một bộ ba con xúc xắc không có thứ tự thành một cuộn súc sắc thống nhất, nhưng không may là không độc lập về mặt xác suất.
