3つのサイコロ(1〜6の整数値)をソートされた順に(区別できないように)与え、それらを同一の分布を持つ2つの公平なサイコロの合計に変換します。
3対1の答えは、6を法としてそれらすべてを合計することです。最終結果は、完全にフラットな分布であり、6つの数値のそれぞれが等しくなる可能性があります(単一のダイのように)。
6を法としてすべてを合計することにより、3対1でこれを行うのは簡単です。最終結果は完全にフラットな分布になり、6つの数字のそれぞれが(単一のダイのように)等しくなります。あなたの課題は、3対2で同じことをすることです。
standupmathのThe Three Indistinguishable Dice Puzzleに触発されました。フォローアップの「ソリューション」ビデオも投稿されましたが、何らかの形で「優雅さ」について議論するのは少し主観的です。文字のカウントはそうではありません。:D
説明書
3つのソートされた整数/桁1〜6 を受け入れ、単一の整数2〜12を出力または返すプログラムまたは関数を作成します。
222222
333333333333
444444444444444444
555555555555555555555555
666666666666666666666666666666
777777777777777777777777777777777777
888888888888888888888888888888
999999999999999999999999
AAAAAAAAAAAAAAAAAA
BBBBBBBBBBBB
CCCCCC
(16進数を使用して単一の文字を保持しました。10進数の出力は問題ありません)
サイコロは見分けがつかないので、サイコロに固有の順序はありません。したがって、ソートされた入力です。単純に「3番目を落とす」ことはできません。それは曖昧だからです。
詳細
- スコアはプログラムのバイト単位の長さです
- プログラムは、なんらかの方法で呼び出される関数、またはstdinから読み取る実行可能なスクリプト、または任意の便利なものにすることができます。
- 別のソースからエントロピーを取得することによる「リローリング」なし
例(およびテスト)
あらゆる種類の確率的テストを行うのではなく、3つのサイコロすべての216(6³)ケースをリッピングして、関数が必要な回数だけ各値を返すと断言するのは簡単です。同一のパラメーターで呼び出されます(例えば、ケース1, 2, 3と3, 2, 1、...は区別できないと推定され、(任意に)に変換されます1, 2, 3)。
回答の例(非常にブルートフォースで非効率的)とテストスイートをPythonで以下に示します。テストビットがあなたの選択した言語に移植するのに十分明確であることを願っていますが、stdin / stdoutを行うことは少し異なります。テストコードはテスト用であり、スコアは付けられません(ただし、言語またはI / Oメソッドの他のユーザーに提供する場合は便利です)。
# 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均一な単一ダイスに順序付けられていないダイスの三重を変換するが、残念ながら確率独立していません。
