Étant donné trois lancers de dés (valeurs entières de 1 à 6) dans un ordre trié (afin de ne pas les distinguer), convertissez-les en la somme de deux dés équitables avec une distribution identique.
La réponse pour trois contre un est de les résumer tous, modulo 6. Le résultat final est une distribution parfaitement plate, où chacun des six nombres est également probable (comme un seul dé).
Il est facile de le faire en trois contre un, en les sommant tous modulo 6. Le résultat final est une distribution parfaitement plate, où chacun des six nombres est également probable (tout comme un seul dé). Votre défi est de faire de même pour trois contre deux.
Inspiré par le casse-tête des trois cubes indiscernables de standupmath . Une vidéo de "solution" de suivi a également été publiée, mais argumenter sur "l'élégance" d'une manière ou d'une autre est un peu subjectif. Le comptage des caractères ne l'est pas.:D
Instructions
Écrivez un programme ou une fonction qui accepte trois entiers / chiffres triés , 1-6, et génère ou renvoie un seul entier, 2-12, de sorte que, pour les 216 entrées possibles, les sorties sont réparties comme suit:
222222
333333333333
444444444444444444
555555555555555555555555
666666666666666666666666666666
777777777777777777777777777777777777
888888888888888888888888888888
999999999999999999999999
AAAAAAAAAAAAAAAAAA
BBBBBBBBBBBB
CCCCCC
(J'ai utilisé hex pour conserver des caractères uniques; la sortie décimale est très bien)
Parce que les dés sont indiscernables, il n'y a pas d'ordre intrinsèque pour eux, d'où l'entrée triée. Vous ne pouvez pas simplement "laisser tomber le troisième" car ce serait ambigu.
Détails
- Le score est la longueur du programme en octets
- Le programme peut être une fonction qui est appelée d'une manière ou d'une autre, ou un script exécutable qui lit à partir de stdin, ou tout ce qui convient.
- Pas de "relance" en obtenant l'entropie d'une autre source
Exemple (et test)
Plutôt que de faire une sorte de test probabiliste, il est assez facile de déchiffrer les 216 (6³) cas des trois dés et d'affirmer que votre fonction renvoie chaque valeur autant de fois qu'elle le devrait. Il sera appelé avec des paramètres identiques (par exemple, les cas 1, 2, 3
et 3, 2, 1
, ... sont présumés indiscernables et sont (arbitrairement) convertis en 1, 2, 3
).
Un exemple de réponse (extrêmement brutale et inefficace) et une suite de tests sont fournis ci-dessous en Python. Espérons que les bits de test soient suffisamment clairs pour être portés dans la langue de votre choix, bien que faire stdin / stdout soit un peu différent. Le code de test est juste pour le test et n'est pas noté (bien que si vous souhaitez le fournir à d'autres utilisateurs de votre langue ou de votre méthode d'E / S, cela pourrait être 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+1
et (a*b*c)%7
convertir un triple de dés à désordonnées un jet de dé unique uniforme, mais malheureusement , ne sont pas indépendants probabilistes.