Давши три рулони кісток (цілі значення від 1 до 6) у відсортованому порядку (щоб їх було не відрізняти), перетворіть їх на суму двох справедливих кісток з однаковим розподілом.
Відповідь за три до одного - це підсумовування їх усіх, модуль 6. Кінцевим результатом є ідеально рівне розподіл, де кожне з шести чисел однаково вірогідне (як і одна помер).
Це легко зробити для трьох на один, підсумовуючи їх за всіма модулями 6. Кінцевим результатом є ідеально рівне розподіл, де кожне з шести чисел однаково вірогідне (як і одна помер). Ваше завдання - зробити те ж саме для трьох-двох.
Натхненний головоломкою "Три нерозрізні кістки" standupmath . Також було розміщено наступне відео "рішення" , але сперечатися про "вишуканість" так чи інакше є трохи суб'єктивно. Підрахунок символів не є.:D
Інструкції
Напишіть програму або функцію, яка приймає три відсортовані цілі числа / цифри, 1-6, і виводить або повертає одне ціле число, 2-12, таким чином, щоб на 216 можливих входів виводи розподілялися як:
222222
333333333333
444444444444444444
555555555555555555555555
666666666666666666666666666666
777777777777777777777777777777777777
888888888888888888888888888888
999999999999999999999999
AAAAAAAAAAAAAAAAAA
BBBBBBBBBBBB
CCCCCC
(Я використовував шістнадцяткову кнопку, щоб утримувати окремі символи; десятковий вихід - це добре)
Оскільки кістки не відрізняються, то для них немає внутрішнього порядку, отже, відсортований вхід. Ви не можете просто "кинути третю", тому що це було б неоднозначно.
Деталі
- Оцінка - це довжина програми в байтах
- Програма може бути функцією, яка так чи інакше називається, або виконуваним сценарієм, який читається зі stdin, або будь-якого зручного.
- Немає «перемотування» шляхом отримання ентропії з іншого джерела
Приклад (і тест)
Замість того, щоб робити якісь імовірнісні тестування, досить просто пробити 216 (6³) випадків усіх трьох кубиків і стверджувати, що ваша функція повертає кожне значення стільки разів, скільки слід. Він буде викликатися з однаковими параметрами (наприклад, випадки 1, 2, 3
і 3, 2, 1
, ... вважаються нерозрізними і перетворюються (довільно) в 1, 2, 3
).
Приклад відповіді (надзвичайно жорстка і неефективна) та тестовий набір наведено нижче в Python. Сподіваємось, тестові біти є достатньо зрозумілими, щоб перенести на вашу обрану мову, хоча виконання stdin / stdout було б трохи інакше. Код тестування призначений лише для тестування та не набраний (хоча якщо ви хочете надати його іншим користувачам вашої мови чи методу вводу / виводу, це може бути корисно).
# 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
перетворити трійку неупорядкованих кісток в рівномірний одинарний рулон, але, на жаль, не є ймовірнісно незалежними.