区別できない3つのサイコロ


12

明確な立方体の3つのサイコロ

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, 33, 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

2
私は何度か質問を読みましたが、それが何を求めているのか少しもわかりません。
feersum

1
このチャレンジの問題が不明確であることに加えて、コードゴルフチャレンジは、そのデフォルトをオーバーライドする本当に正当な理由がない限り、文字ではなくバイトでスコアリングする必要があります。
メゴ

わかったと思う。問題は、3つのサイコロロールから2つのサイコロロールにマッピングすることですが、いくつかの制約があります。
リーキー修道女

2
2つのサイコロでそれ作っているのはなく、3つのロールを使って2つのロールをシミュレートしています。
ニックT

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のすべての結果をシミュレートします

1バイトのゴルフをしてくれた@ jimmy23013に感謝します!


答えを投稿する前にコードを読んでおくべき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]

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.