Üç zar rulosu (1-6 arasındaki tamsayı değerleri) sıralı düzende (ayırt edilemez olacak şekilde) verildiğinde , bunları aynı dağıtımla iki adil zarın toplamına dönüştürün .
Üçüncülüğün cevabı hepsini özetliyor, modulo 6. Sonuç, altı sayının her birinin eşit derecede muhtemel olduğu (tıpkı tek bir kalıp gibi) mükemmel düz bir dağılımdır.
Üç modele hepsini modulo 6 toplayarak yapmak kolaydır. Sonuç, altı sayının her birinin eşit derecede olası olduğu (tıpkı tek bir kalıp gibi) mükemmel düz bir dağılımdır. Senin meydan okuma aynı şeyi üçe iki yapmak.
Standupmath Üç Belirsiz Zar Bulmaca esinlenerek . Bir takip "çözüm" videosu da yayınlandı, ancak şu ya da bu şekilde "zarafet" hakkında tartışmak biraz öznel. Karakter saymak değil.:D
Talimatlar
1-6 sıralı üç tamsayıyı / basamağı kabul eden ve çıkışları tek bir tam sayı, 2-12 döndüren bir program veya işlev yazın , böylece 216 olası giriş için çıkışlar şu şekilde dağıtılır:
222222
333333333333
444444444444444444
555555555555555555555555
666666666666666666666666666666
777777777777777777777777777777777777
888888888888888888888888888888
999999999999999999999999
AAAAAAAAAAAAAAAAAA
BBBBBBBBBBBB
CCCCCC
(Tek karakterleri tutmak için hex kullandım; ondalık çıktı iyi)
Zar ayırt edilemez olduğundan, bunlara özgü bir düzen yoktur, dolayısıyla sıralı girdi. Basitçe "üçüncüyü düşüremezsiniz" çünkü bu belirsiz olacaktır.
ayrıntılar
- Puan, programın bayt cinsinden uzunluğudur
- Program bir şekilde adlandırılan bir işlev veya stdin'den veya uygun olanı okuyan yürütülebilir komut dosyası olabilir.
- Başka bir kaynaktan entropi alarak "yeniden kayıt" yapılamaz
Örnek (ve test)
Herhangi bir olasılıklı test yapmak yerine, üç zarın 216 (6³) vakasını parçalamak ve fonksiyonunuzun her değeri gerektiği kadar döndürdüğünü iddia etmek yeterince kolaydır. Aynı parametrelerle çağrılır (örneğin, vakalar 1, 2, 3
ve 3, 2, 1
... ayırt edilemez olarak kabul edilir ve (keyfi olarak) dönüştürülür 1, 2, 3
).
Python'da örnek bir cevap (son derece kaba kuvvet ve verimsiz) ve test takımı aşağıda verilmiştir. Umarım test bitleri seçtiğiniz dilinize uyacak kadar açıktır, ancak stdin / stdout yapmak biraz farklı olacaktır. Test kodu yalnızca test amaçlıdır ve puanlandırılmaz (yine de, dilinizin veya G / Ç yönteminizin diğer kullanıcılarına sağlamak istiyorsanız, bu yararlı olabilir).
# 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
ve (a*b*c)%7
üç düzensiz zarları tek tip bir kalıp rulosuna dönüştürür, ancak maalesef olasılıkla bağımsız değildir.