Учитывая три броска костей (целые значения от 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
(a+b+c)%6+1
и(a*b*c)%7
конвертировать тройку неупорядоченных кубиков в единый бросок кубика, но, к сожалению, не являются вероятностно независимыми.Ответы:
Желе ,
2220 байтПопробуйте онлайн! или смоделируйте все 216 результатов .
Фон
Мы отображаем каждую неупорядоченную тройку бросков костей (перечисленных с соответствующими кратностями) в упорядоченную пару бросков костей следующим образом:
Это делает все результаты равновероятными.
Как это устроено
источник
CJam,
2524 байтаЭто порт моего желе ответа .
Попробуйте онлайн! или смоделируйте все 216 результатов .
Спасибо @ jimmy23013 за отыгрывание 1 байта!
источник
6bW2t1b
.Pyth,
4127 байт10 случайных тестов
Подтверждение действительности.
Таблица перевода:
Предыдущее 41-байтовое решение:
Мне нужно в гольф это ...
Попробуйте онлайн!
Таблица перевода:
источник
CJam,
3735 байтВероятно, не в гольф хорошо.
Но победил Пиф.Попробуй это здесь.
источник