Три нерозрізні кубики


12

Три кубики у прозорий кубик

Давши три рулони кісток (цілі значення від 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

2
Я читав питання кілька разів і не маю ні найменшого уявлення про те, що він просить.
feersum

1
Окрім того, що проблема цього виклику є незрозумілою, проблеми з кодом для гольфу повинні оцінюватись байтами, а не символами, якщо ви не маєте дійсно вагомих причин перекрити цей дефолт.
Мего

Я думаю, що я це розумію. Питання полягає в тому, щоб ми зіставили три рулони з кістки на два рулони з кістки з деякими обмеженнями.
Лина монашка

2
Ви не робите це з двома кубиками, ви використовуєте три рулони для імітації двох рулонів.
Нік Т

2
І те, (a+b+c)%6+1і (a*b*c)%7перетворити трійку неупорядкованих кісток в рівномірний одинарний рулон, але, на жаль, не є ймовірнісно незалежними.
xnor

Відповіді:


5

Желе , 22 20 байт

6ṗ3Ṣ€ṢðQ€L€Ụịḷi’:6d6‘S

Спробуйте в Інтернеті! або моделювати всі 216 результатів .

Фон

Будемо відображати кожну невпорядковану трійку рулонів з кісток (перелічених із відповідною кратністю) на упорядковану пару рулонів з кістки таким чином:

[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3],[1,2,3] -> [1,1]
[1,2,4],[1,2,4],[1,2,4],[1,2,4],[1,2,4],[1,2,4] -> [1,2]
[1,2,5],[1,2,5],[1,2,5],[1,2,5],[1,2,5],[1,2,5] -> [1,3]
[1,2,6],[1,2,6],[1,2,6],[1,2,6],[1,2,6],[1,2,6] -> [1,4]
[1,3,4],[1,3,4],[1,3,4],[1,3,4],[1,3,4],[1,3,4] -> [1,5]
[1,3,5],[1,3,5],[1,3,5],[1,3,5],[1,3,5],[1,3,5] -> [1,6]
[1,3,6],[1,3,6],[1,3,6],[1,3,6],[1,3,6],[1,3,6] -> [2,1]
[1,4,5],[1,4,5],[1,4,5],[1,4,5],[1,4,5],[1,4,5] -> [2,2]
[1,4,6],[1,4,6],[1,4,6],[1,4,6],[1,4,6],[1,4,6] -> [2,3]
[1,5,6],[1,5,6],[1,5,6],[1,5,6],[1,5,6],[1,5,6] -> [2,4]
[2,3,4],[2,3,4],[2,3,4],[2,3,4],[2,3,4],[2,3,4] -> [2,5]
[2,3,5],[2,3,5],[2,3,5],[2,3,5],[2,3,5],[2,3,5] -> [2,6]
[2,3,6],[2,3,6],[2,3,6],[2,3,6],[2,3,6],[2,3,6] -> [3,1]
[2,4,5],[2,4,5],[2,4,5],[2,4,5],[2,4,5],[2,4,5] -> [3,2]
[2,4,6],[2,4,6],[2,4,6],[2,4,6],[2,4,6],[2,4,6] -> [3,3]
[2,5,6],[2,5,6],[2,5,6],[2,5,6],[2,5,6],[2,5,6] -> [3,4]
[3,4,5],[3,4,5],[3,4,5],[3,4,5],[3,4,5],[3,4,5] -> [3,5]
[3,4,6],[3,4,6],[3,4,6],[3,4,6],[3,4,6],[3,4,6] -> [3,6]
[3,5,6],[3,5,6],[3,5,6],[3,5,6],[3,5,6],[3,5,6] -> [4,1]
[4,5,6],[4,5,6],[4,5,6],[4,5,6],[4,5,6],[4,5,6] -> [4,2]
[1,2,2],[1,2,2],[1,2,2],[1,3,3],[1,3,3],[1,3,3] -> [4,3]
[1,4,4],[1,4,4],[1,4,4],[1,5,5],[1,5,5],[1,5,5] -> [4,4]
[1,6,6],[1,6,6],[1,6,6],[2,3,3],[2,3,3],[2,3,3] -> [4,5]
[2,4,4],[2,4,4],[2,4,4],[2,5,5],[2,5,5],[2,5,5] -> [4,6]
[2,6,6],[2,6,6],[2,6,6],[3,4,4],[3,4,4],[3,4,4] -> [5,1]
[3,5,5],[3,5,5],[3,5,5],[3,6,6],[3,6,6],[3,6,6] -> [5,2]
[4,5,5],[4,5,5],[4,5,5],[4,6,6],[4,6,6],[4,6,6] -> [5,3]
[5,6,6],[5,6,6],[5,6,6],[1,1,2],[1,1,2],[1,1,2] -> [5,4]
[1,1,3],[1,1,3],[1,1,3],[1,1,4],[1,1,4],[1,1,4] -> [5,5]
[1,1,5],[1,1,5],[1,1,5],[1,1,6],[1,1,6],[1,1,6] -> [5,6]
[2,2,3],[2,2,3],[2,2,3],[2,2,4],[2,2,4],[2,2,4] -> [6,1]
[2,2,5],[2,2,5],[2,2,5],[2,2,6],[2,2,6],[2,2,6] -> [6,2]
[3,3,4],[3,3,4],[3,3,4],[3,3,5],[3,3,5],[3,3,5] -> [6,3]
[3,3,6],[3,3,6],[3,3,6],[4,4,5],[4,4,5],[4,4,5] -> [6,4]
[4,4,6],[4,4,6],[4,4,6],[5,5,6],[5,5,6],[5,5,6] -> [6,5]
[1,1,1],[2,2,2],[3,3,3],[4,4,4],[5,5,5],[6,6,6] -> [6,6]

Це робить усі результати однозначними.

Як це працює

6ṗ3Ṣ€ṢðĠ€Ụịḷi’:6d6‘S  Main link. Argument: D (three dice rolls, sorted)

6ṗ3                     Generate lists of length 3 over [1, 2, 3, 4, 5, 6].
   Ṣ€                   Sort each triplet.
     Ṣ                  Sort the list of triplets.
      ð                 Begin a new, dyadic chain.
                        Arguments: A (list of triplets), D
       Ġ€               Group each; group the indices of each triplet by the
                        the corresponding values.
                        For a triplet [a, b, c], this yields:
                          [[1], [2], [3]] if a < b < c
                          [[1], [2, 3]]   if a < b = c
                          [[1, 2], [3]]   if a = b < c
                          [[1, 2, 3]]     if a = b = c
           Ụ            Grade up; sort the indices of A by those 2D lists.
            ịḷ          Retrieve the elements of A at those indices.
                        This sorts A as in the previous section.
              i         Find the (1-based) index of D.
               ’        Decrement to get the 0-based index.
                :6      Divide the index by 6, rounding down.
                  d6    Divmod; return quotient and remainder of division by 6.
                    ‘   Increment to map [0, ..., 5] to [1, ..., 6].
                     S  Sum the results.

1

CJam, 25 24 байти

6Zm*{$e`z}$q~:(a#6bW2t1b

Це портрет моєї відповіді на желе .

Спробуйте в Інтернеті! або моделювати всі 216 результатів .

Дякуємо @ jimmy23013 за те, що гольф на 1 байт!


Ну, я повинен прочитати код , перш ніж відправляти відповідь ... Але деякі прості гольф: 6bW2t1b.
jimmy23013

@ jimmy23013 Приємно. Дякую!
Денніс

1

Pyth, 41 27 байт

JSSM^S6 3+2sPtj+216xo/JNJQ6

10 випадкових тестів

Підтвердження чинності.

Таблиця переходів:

2: [111, 222, 333, 444, 555, 666]
3: [112, 113, 223, 224]
4: [114, 115, 225, 226, 355, 366]
5: [116, 122, 125, 233, 244, 445, 446]
6: [126, 133, 144, 146, 255, 266, 455, 466]
7: [134, 155, 156, 166, 246, 334, 335, 556, 566]
8: [123, 135, 234, 256, 336, 344]
9: [124, 136, 235, 345]
10: [145, 236, 346]
11: [245, 356]
12: [456]

Попереднє 41-байтове рішення:

Мені потрібно гольфу це ...

JSM^S6 3+2f/@co,/JNNJ.u+NY*R6t+S5_S6 6TQ0

Спробуйте в Інтернеті!

Таблиця переходів:

2: [111, 222, 333, 444, 555, 666]

3: [112, 113, 114, 115]

4: [116, 122, 133, 144, 155, 166]

5: [223, 224, 225, 226, 233, 244, 255, 266]

6: [334, 335, 336, 344, 355, 366, 445, 446, 455, 466]

7: [556, 566, 123, 124, 125, 126, 134]

8: [135, 136, 145, 146, 156]

9: [234, 235, 236, 245]

10: [246, 256, 345]

11: [346, 356]

12: [456]

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.