Bei drei Würfeln (ganzzahlige Werte von 1 bis 6) in sortierter Reihenfolge (so dass sie nicht zu unterscheiden sind), konvertieren Sie sie in die Summe von zwei fairen Würfeln mit identischer Verteilung.
Die Antwort für drei zu eins ist, sie alle zu summieren, Modulo 6. Das Endergebnis ist eine vollkommen flache Verteilung, bei der jede der sechs Zahlen gleich wahrscheinlich ist (genau wie ein einzelner Würfel).
Es ist einfach, dies für drei zu eins zu tun, indem Sie alle Modulo 6 addieren. Das Endergebnis ist eine vollkommen flache Verteilung, bei der jede der sechs Zahlen gleich wahrscheinlich ist (genau wie ein einzelner Würfel). Ihre Herausforderung besteht darin, dasselbe für drei zu zwei zu tun.
Inspiriert von Standupmaths The Three Indistinguishable Dice Puzzle . Es wurde auch ein "Lösungs" -Video gepostet, aber über "Eleganz" auf die eine oder andere Weise zu streiten, ist ein bisschen subjektiv. Zeichen zählen geht nicht.:D
Anleitung
Schreiben Sie ein Programm oder eine Funktion, die drei sortierte Ganzzahlen / Ziffern (1-6) akzeptiert und eine einzelne Ganzzahl (2-12) ausgibt oder zurückgibt, sodass die Ausgaben für die 216 möglichen Eingaben wie folgt verteilt sind:
222222
333333333333
444444444444444444
555555555555555555555555
666666666666666666666666666666
777777777777777777777777777777777777
888888888888888888888888888888
999999999999999999999999
AAAAAAAAAAAAAAAAAA
BBBBBBBBBBBB
CCCCCC
(Ich habe hex verwendet, um einzelne Zeichen beizubehalten; die Dezimalausgabe ist in Ordnung.)
Da die Würfel nicht zu unterscheiden sind, gibt es für sie keine innere Reihenfolge, daher die sortierte Eingabe. Sie können den Dritten nicht einfach "fallen lassen", da dies mehrdeutig wäre.
Einzelheiten
- Score ist die Länge des Programms in Bytes
- Das Programm kann eine Funktion sein, die irgendwie aufgerufen wird, oder ein ausführbares Skript, das von stdin liest, oder was auch immer zweckmäßig ist.
- Kein "Nachrollen" durch Entropie von einer anderen Quelle
Beispiel (und Test)
Anstatt irgendwelche probabilistischen Tests durchzuführen, ist es einfach genug, die 216 (6³) Fälle aller drei Würfel durchzugehen und zu behaupten, dass Ihre Funktion jeden Wert so oft zurückgibt, wie sie sollte. Es wird mit identischen Parametern aufgerufen (zB werden die Fälle 1, 2, 3
und 3, 2, 1
, ... als nicht unterscheidbar angenommen und (willkürlich) in konvertiert 1, 2, 3
).
Eine Beispielantwort (extrem brachial und ineffizient) und eine Testsuite finden Sie weiter unten in Python. Hoffentlich sind die Testbits klar genug, um auf die Sprache Ihrer Wahl zu portieren, obwohl stdin / stdout etwas anders wäre. Der Testcode dient nur zum Testen und wird nicht bewertet (wenn Sie ihn jedoch für andere Benutzer Ihrer Sprache oder E / A-Methode bereitstellen möchten, ist dies möglicherweise hilfreich).
# 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
und (a*b*c)%7
ein Dreifaches von ungeordneten Würfeln in einen einheitlichen Einzelwürfelwurf umwandeln, sind aber leider nicht probabilistisch unabhängig.