Tiga Dadu Tidak Dapat Dibedakan

12

Tiga dadu dalam kubus yang jelas

Diberikan tiga gulungan dadu (nilai integer dari 1-6) dalam urutan diurutkan (agar tidak dapat dibedakan), konversikan dengan jumlah dua dadu yang adil dengan distribusi yang identik.

Jawaban untuk tiga banding satu adalah menjumlahkan semuanya, modulo 6. Hasil akhirnya adalah distribusi yang benar-benar datar, di mana masing-masing dari keenam angka itu sama-sama berpeluang besar (seperti satu dadu).

Sangat mudah untuk melakukan ini untuk tiga-ke-satu, dengan menjumlahkan mereka semua modulo 6. Hasil akhirnya adalah distribusi yang benar-benar datar, di mana masing-masing dari keenam angka tersebut memiliki kemungkinan yang sama (seperti halnya satu die). Tantangan Anda adalah melakukan hal yang sama untuk tiga hingga dua.

Terinspirasi oleh The Three Indistinguishable Dice Puzzle milik standupmath . Video "solusi" tindak lanjut juga diposting, tetapi berdebat tentang "keanggunan" dari satu atau lain cara agak subyektif. Menghitung karakter tidak.:D

Instruksi

Menulis sebuah program atau fungsi yang menerima tiga diurutkan bilangan bulat / digit, 1-6, dan output atau hasil satu bilangan bulat, 2-12, sehingga, untuk 216 kemungkinan input, output didistribusikan sebagai:

 222222
 333333333333
 444444444444444444
 555555555555555555555555
 666666666666666666666666666666
 777777777777777777777777777777777777
 888888888888888888888888888888
 999999999999999999999999
 AAAAAAAAAAAAAAAAAA
 BBBBBBBBBBBB
 CCCCCC

(Saya telah menggunakan hex untuk mempertahankan karakter tunggal; output desimal baik-baik saja)

Karena dadu tidak dapat dibedakan, tidak ada urutan intrinsik untuk mereka, maka input diurutkan. Anda tidak bisa begitu saja "menjatuhkan yang ketiga" karena itu akan ambigu.

Detail

  • Skor adalah panjang program dalam byte
  • Program dapat berupa fungsi yang disebut entah bagaimana, atau skrip yang dapat dieksekusi yang bertuliskan dari stdin, atau apa pun yang nyaman.
  • Tidak ada "rerolling" dengan mendapatkan entropi dari sumber lain

Contoh (dan uji)

Daripada melakukan segala macam pengujian probabilistik, cukup mudah untuk merobek 216 (6³) kasus dari ketiga dadu dan menegaskan bahwa fungsi Anda mengembalikan setiap nilai sebanyak yang seharusnya. Ini akan dipanggil dengan parameter yang identik (mis. Kasing 1, 2, 3dan 3, 2, 1, ... dianggap tidak dapat dibedakan dan (secara sewenang-wenang) dikonversi menjadi 1, 2, 3).

Contoh jawaban (sangat kasar dan tidak efisien) dan test suite disediakan di bawah ini dalam Python. Semoga bit tes cukup jelas untuk port ke bahasa pilihan Anda, meskipun melakukan stdin / stdout akan sedikit berbeda. Kode pengujian hanya untuk pengujian dan tidak diberi skor (meskipun jika Anda ingin menyediakannya untuk pengguna lain dari bahasa Anda atau metode I / O, itu mungkin berguna).

# 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
Nick T
sumber
2
Saya membaca pertanyaan itu beberapa kali dan tidak tahu apa yang diminta.
feersum
1
Selain masalah tantangan ini yang tidak jelas, tantangan kode golf harus dinilai dengan byte daripada karakter, kecuali Anda memiliki alasan yang sangat bagus untuk mengganti default itu.
Mego
Saya rasa saya mengerti. Pertanyaannya adalah meminta kita untuk memetakan dari tiga gulungan dadu menjadi dua gulungan dadu, dengan beberapa kendala.
Leaky Nun
2
Anda tidak membuatnya dengan dua dadu, Anda menggunakan tiga gulungan untuk mensimulasikan dua gulungan.
Nick T
2
Keduanya (a+b+c)%6+1dan (a*b*c)%7mengonversi tiga kali lipat dadu yang tidak berurutan menjadi satu gulungan dadu yang seragam, tetapi sayangnya tidak independen secara probabilistik.
xnor

Jawaban:

5

Jelly , 22 20 byte

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

Cobalah online! atau mensimulasikan semua hasil 216 .

Latar Belakang

Kami memetakan setiap triplet gulungan dadu yang tidak berurutan (dicantumkan dengan beragamnya masing-masing) ke pasangan gulungan dadu yang dipesan dengan cara berikut:

[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]

Ini membuat semua hasil bisa dikerjakan.

Bagaimana itu bekerja

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.
Dennis
sumber
1

CJam, 25 24 byte

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

Ini adalah port jawaban Jelly saya .

Cobalah online! atau mensimulasikan semua hasil 216 .

Terima kasih kepada @ jimmy23013 untuk bermain golf 1 byte!

Dennis
sumber
Yah, aku harus memiliki membaca kode Anda sebelum posting jawaban ... Tapi golf sederhana: 6bW2t1b.
jimmy23013
@ jimmy23013 Bagus. Terima kasih!
Dennis
1

Pyth, 41 27 byte

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

10 testcas acak

Konfirmasi validitas.

Tabel konversi:

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]

Solusi 41 byte sebelumnya:

Saya perlu golf ini ...

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

Cobalah online!

Tabel konversi:

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]
Biarawati Bocor
sumber
1

CJam, 37 35 byte

Mungkin tidak bermain golf dengan baik. Tapi kalahkan Pyth.

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

Coba di sini.

jimmy23013
sumber
Saya sarankan Anda mengubah deskripsi itu.
Leaky Nun