Три неразличимых кубика

12

Три кубика в прозрачном кубе

Учитывая три броска костей (целые значения от 1 до 6) в отсортированном порядке (чтобы их нельзя было различить), конвертируйте их в сумму двух справедливых костей с одинаковым распределением.

Ответом «три к одному» является суммирование их всех по модулю 6. Конечный результат - абсолютно плоское распределение, где каждое из шести чисел одинаково вероятно (точно так же, как один кубик).

Это легко сделать три к одному, суммируя их все по модулю 6. Конечный результат - абсолютно плоское распределение, где каждое из шести чисел одинаково вероятно (как один кристалл). Ваша задача состоит в том, чтобы сделать то же самое для трех к двум.

Вдохновленный загадкой «Три неотличимых кубика» от standupmath . Также было опубликовано последующее видео о «решении» , но спор об «элегантности», так или иначе, немного субъективен. Подсчет символов не:D

инструкции

Напишите программу или функцию, которая принимает три отсортированных целых числа / цифры 1-6 и выводит или возвращает одно целое число 2-12, так что для 216 возможных входов выходные данные распределяются следующим образом:

 222222
 333333333333
 444444444444444444
 555555555555555555555555
 666666666666666666666666666666
 777777777777777777777777777777777777
 888888888888888888888888888888
 999999999999999999999999
 AAAAAAAAAAAAAAAAAA
 BBBBBBBBBBBB
 CCCCCC

(Я использовал шестнадцатеричный код, чтобы сохранить одиночные символы; десятичный вывод в порядке)

Поскольку кубики неразличимы, у них нет внутреннего порядка, отсюда и отсортированный ввод. Вы не можете просто «отбросить третий», потому что это было бы неоднозначно.

Детали

  • Оценка - это длина программы в байтах.
  • Программа может быть функцией, которая каким-то образом вызывается, или исполняемым скриптом, который читает из стандартного ввода, или любым другим удобным способом.
  • Никакой "перезаписи" путем получения энтропии из другого источника

Пример (и тест)

Вместо того, чтобы выполнять какое-либо вероятностное тестирование, достаточно просто просмотреть 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]
Дрянная Монахиня
источник
1

CJam, 37 35 байт

Вероятно, не в гольф хорошо. Но победил Пиф.

8aq~\;[_2$>8+@7+@:U2+1$([8U4$7]])er

Попробуй это здесь.

jimmy23013
источник
Я предлагаю вам изменить это описание.
Утренняя монахиня