Dadas tres tiradas de dados (valores enteros de 1-6) en orden ordenado (para que no se puedan distinguir), conviértalos a la suma de dos dados justos con una distribución idéntica.
La respuesta para tres a uno es sumarlos a todos, módulo 6. El resultado final es una distribución perfectamente plana, donde cada uno de los seis números es igualmente probable (como un solo dado).
Es fácil hacer esto para tres a uno, sumando todos los módulos 6. El resultado final es una distribución perfectamente plana, donde cada uno de los seis números es igualmente probable (como un solo dado). Su desafío es hacer lo mismo para tres a dos.
Inspirado en The Three Indistinguishable Dice Puzzle de standupmath . También se publicó un video de "solución" de seguimiento , pero discutir sobre la "elegancia" de una forma u otra es un poco subjetivo. Contar personajes no lo es.:D
Instrucciones
Escriba un programa o función que acepte tres enteros / dígitos ordenados , 1-6, y genere o devuelva un solo entero, 2-12, de modo que, para las 216 posibles entradas, las salidas se distribuyan como:
222222
333333333333
444444444444444444
555555555555555555555555
666666666666666666666666666666
777777777777777777777777777777777777
888888888888888888888888888888
999999999999999999999999
AAAAAAAAAAAAAAAAAA
BBBBBBBBBBBB
CCCCCC
(He usado hexadecimal para mantener caracteres individuales; la salida decimal está bien)
Debido a que los dados son indistinguibles, no hay un orden intrínseco para ellos, de ahí la entrada ordenada. No puedes simplemente "soltar el tercero" porque eso sería ambiguo.
Detalles
- La puntuación es la longitud del programa en bytes.
- El programa puede ser una función que se llama de alguna manera, o un script ejecutable que lee de stdin, o lo que sea conveniente.
- No "re-enrollar" obteniendo entropía de otra fuente
Ejemplo (y prueba)
En lugar de hacer cualquier tipo de prueba probabilística, es bastante fácil analizar los 216 (6³) casos de los tres dados y afirmar que su función devuelve cada valor tantas veces como debería. Se llamará con parámetros idénticos (por ejemplo, los casos 1, 2, 3
y 3, 2, 1
, ... se presume que no se pueden distinguir y se convierten (arbitrariamente) a 1, 2, 3
).
Un ejemplo de respuesta (extremadamente fuerza bruta e ineficiente) y el conjunto de pruebas se proporciona a continuación en Python. Esperemos que los bits de prueba sean lo suficientemente claros como para transferirlos al idioma de su elección, aunque hacer stdin / stdout sería un poco diferente. El código de prueba es solo para pruebas y no está calificado (aunque si desea proporcionarlo a otros usuarios de su idioma o método de E / S, puede ser útil).
# 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
y(a*b*c)%7
convertir un triple de dados no ordenadas a una sola tirada uniforme, pero por desgracia no son probabilísticamente independientes.Respuestas:
Jalea ,
2220 bytesPruébalo en línea! o simular los 216 resultados .
Antecedentes
Mapeamos cada triplete desordenado de tiradas de dados (enumerados con las respectivas multiplicidades) a un par ordenado de tiradas de dados de la siguiente manera:
Esto hace que todos los resultados sean equiprobables.
Cómo funciona
fuente
CJam,
2524 bytesEste es un puerto de mi respuesta Jelly .
Pruébalo en línea! o simular los 216 resultados .
¡Gracias a @ jimmy23013 por jugar golf en 1 byte!
fuente
6bW2t1b
.Pyth,
4127 bytes10 casos de prueba al azar
Confirmación de validez.
Tabla de conversión:
Solución anterior de 41 bytes:
Necesito jugar al golf ...
Pruébalo en línea!
Tabla de conversión:
fuente
CJam,
3735 bytesProbablemente no haya jugado bien al golf.
Pero vencer a Pyth.Pruébalo aquí.
fuente