Dato tre tiri di dado (valori interi da 1 a 6) in ordine ordinato (in modo da essere indistinguibili), convertili nella somma di due dadi equi con una distribuzione identica.
La risposta per tre a uno è sommarli tutti, modulo 6. Il risultato finale è una distribuzione perfettamente piatta, in cui ciascuno dei sei numeri è ugualmente probabile (proprio come un singolo dado).
È facile farlo per tre a uno, sommandoli tutti al modulo 6. Il risultato finale è una distribuzione perfettamente piatta, in cui ciascuno dei sei numeri è ugualmente probabile (proprio come un singolo dado). La tua sfida è fare lo stesso per tre-due.
Ispirato da The Three Indistinguishable Dice Puzzle di standupmath . È stato anche pubblicato un video di "soluzione" di follow-up , ma discutere dell'eleganza in un modo o nell'altro è un po 'soggettivo. Il conteggio dei personaggi non lo è.:D
Istruzioni
Scrivi un programma o una funzione che accetta tre interi / cifre ordinati , 1-6, e restituisce o restituisce un singolo numero intero, 2-12, in modo tale che, per i 216 possibili ingressi, le uscite siano distribuite come:
222222
333333333333
444444444444444444
555555555555555555555555
666666666666666666666666666666
777777777777777777777777777777777777
888888888888888888888888888888
999999999999999999999999
AAAAAAAAAAAAAAAAAA
BBBBBBBBBBBB
CCCCCC
(Ho usato hex per mantenere i singoli caratteri; l'output decimale va bene)
Poiché i dadi sono indistinguibili, non esiste un ordine intrinseco per loro, quindi l'input ordinato. Non puoi semplicemente "far cadere il terzo" perché sarebbe ambiguo.
Dettagli
- Il punteggio è la lunghezza del programma in byte
- Il programma può essere una funzione chiamata in qualche modo, o script eseguibile che legge da stdin o qualunque cosa sia conveniente.
- Nessun "rilancio" ottenendo entropia da un'altra fonte
Esempio (e test)
Piuttosto che fare qualsiasi tipo di test probabilistico, è abbastanza facile sfogliare i 216 (6³) casi di tutti e tre i dadi e affermare che la tua funzione restituisce ogni valore quante volte dovrebbe. Verrà chiamato con parametri identici (ad esempio i casi 1, 2, 3e 3, 2, 1, ... sono considerati indistinguibili e vengono (arbitrariamente) convertiti in 1, 2, 3).
Una risposta di esempio (estremamente bruta e inefficiente) e una suite di test è fornita di seguito in Python. Si spera che i bit di test siano abbastanza chiari da portare nella tua lingua preferita, anche se fare stdin / stdout sarebbe un po 'diverso. Il codice di test è solo per il test e non viene valutato (anche se se si desidera fornirlo ad altri utenti della propria lingua o metodo I / O, ciò potrebbe essere utile).
# 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+1e (a*b*c)%7convertono un triplo di dadi non ordinati in un tiro di dado singolo uniforme, ma sfortunatamente non sono probabilisticamente indipendenti.
