Un seguimiento de este desafío.
Dado un conjunto de dados mixtos, genera la distribución de frecuencias de tirarlos todos y sumar los números tirados en cada dado.
Por ejemplo, considere 1d12 + 1d8
(tirar 1 dado de 12 lados y 1 dado de 8 lados). Las tiradas máximas y mínimas son 20
y 2
, respectivamente, que es similar al lanzamiento 2d10
(2 dados de 10 lados). Sin embargo, 1d12 + 1d8
resulta en una distribución más plana que 2d10
: [1, 2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8, 7, 6, 5, 4, 3, 2, 1]
versus [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
.
Reglas
- Las frecuencias deben enumerarse en orden creciente de la suma a la que corresponde la frecuencia.
- Se permite etiquetar las frecuencias con las sumas correspondientes, pero no es obligatorio (ya que las sumas se pueden inferir del orden requerido).
- No tiene que manejar entradas donde la salida excede el rango representable de enteros para su idioma.
- Los ceros iniciales o finales no están permitidos. Solo deben aparecer frecuencias positivas en la salida.
- Puede tomar la entrada en cualquier formato razonable (lista de dados (
[6, 8, 8]
), lista de pares de dados ([[1, 6], [2, 8]]
), etc.). - Las frecuencias deben normalizarse para que el MCD de las frecuencias sea 1 (por ejemplo, en
[1, 2, 3, 2, 1]
lugar de[2, 4, 6, 4, 2]
). - Todos los dados tendrán al menos una cara (por lo que a
d1
es el mínimo). - Este es el código de golf , por lo que gana el código más corto (en bytes). Las lagunas estándar están prohibidas, como de costumbre.
Casos de prueba
Estos casos de prueba se dan como input: output
, donde la entrada se da como una lista de pares que [a, b]
representan a
b
dados de lado (así se [3, 8]
refiere 3d8
y se [[1, 12], [1, 8]]
refiere a 1d12 + 1d8
).
[[2, 10]]: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
[[1, 1], [1, 9]]: [1, 1, 1, 1, 1, 1, 1, 1, 1]
[[1, 12], [1, 8]]: [1, 2, 3, 4, 5, 6, 7, 8, 8, 8, 8, 8, 7, 6, 5, 4, 3, 2, 1]
[[2, 4], [3, 6]]: [1, 5, 15, 35, 68, 116, 177, 245, 311, 363, 392, 392, 363, 311, 245, 177, 116, 68, 35, 15, 5, 1]
[[1, 3], [2, 13]]: [1, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 37, 36, 33, 30, 27, 24, 21, 18, 15, 12, 9, 6, 3, 1]
[[1, 4], [2, 8], [2, 20]]: [1, 5, 15, 35, 69, 121, 195, 295, 423, 579, 761, 965, 1187, 1423, 1669, 1921, 2176, 2432, 2688, 2944, 3198, 3446, 3682, 3898, 4086, 4238, 4346, 4402, 4402, 4346, 4238, 4086, 3898, 3682, 3446, 3198, 2944, 2688, 2432, 2176, 1921, 1669, 1423, 1187, 965, 761, 579, 423, 295, 195, 121, 69, 35, 15, 5, 1]
[[1, 10], [1, 12], [1, 20], [1, 50]]: [1, 4, 10, 20, 35, 56, 84, 120, 165, 220, 285, 360, 444, 536, 635, 740, 850, 964, 1081, 1200, 1319, 1436, 1550, 1660, 1765, 1864, 1956, 2040, 2115, 2180, 2235, 2280, 2316, 2344, 2365, 2380, 2390, 2396, 2399, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2400, 2399, 2396, 2390, 2380, 2365, 2344, 2316, 2280, 2235, 2180, 2115, 2040, 1956, 1864, 1765, 1660, 1550, 1436, 1319, 1200, 1081, 964, 850, 740, 635, 536, 444, 360, 285, 220, 165, 120, 84, 56, 35, 20, 10, 4, 1]
Respuestas:
Jalea ,
147 bytes-3 bytes gracias al Sr. Xcoder (uso de un rango implícito para evitar el liderazgo
R
; reemplazo de reducir por el producto cartesiano diádico y aplanarp/F€
, con el producto cartesiano incorporado para ese mismo propósitoŒp
).Un enlace monádico que toma una lista de caras de dados y devuelve la distribución normalizada de las sumas crecientes.
Pruébalo en línea!
¿Cómo?
Revisa la lista de "tamaños" de dados (implícitamente) los convierte en su lista de caras, luego obtiene el producto cartesiano de esas listas (todas las tiradas posibles del conjunto de dados), luego resume esas tiradas, obtiene los grupos iguales índices (por valor ascendente) y toma la longitud de cada grupo.
Nota: solo hay una forma de tirar el mínimo (tirando uno en cada dado) y no contamos dos veces, por lo que no es necesario realizar una normalización GCD.
fuente
÷g/$
(¿no hay siempre una sola forma de obtener el mínimo o el máximo?)ŒpS€µLƙ
MATL , 8 bytes
La entrada es una matriz de tamaños de troqueles (posiblemente repetidos).
Pruébalo en línea! O verificar todos los casos de prueba .
Explicación
fuente
Casco , 7 bytes
La entrada es una lista de dados. Pruébalo en línea!
Explicación
fuente
Haskell , 54 bytes
Pruébalo en línea!
Haskell , 63 bytes
Pruébalo en línea!
Haskell , 68 bytes
Pruébalo en línea!
fuente
Octava ,
88 69 5856 bytesComo se menciona en la respuesta de Haskell, esto utiliza el hecho de que la distribución de, por ejemplo, un dado de 3 lados y uno de 5 lados es la convolución discreta de los dos vectores
[1,1,1]
y[1,1,1,1,1]
. ¡Gracias @LuisMendo por -11 bytes de golf inteligente!Pruébalo en línea!
Esta presentación está utilizando un enfoque recursivo. Pero si usaras un bucle, sería un poco más largo:
fuente
Haskell ,
80 7864 bytesEsta solución terminó siendo casi la misma que la de @ Sherlock9 en el desafío anterior con el enfoque quizás más natural. ¡@xnor tiene una solución Haskell aún más corta !
Explicación:
Pruébalo en línea!
Solución previa:
Esto está utilizando la función de convolución discreta @AndersKaseorg . La observación aquí es que la distribución de, por ejemplo, un dado de 3 lados y un dado de 5 lados es la convolución discreta de los dos vectores
[1,1,1]
y[1,1,1,1,1]
.Pruébalo en línea!
fuente
Wolfram Language (Mathematica) , 26 bytes
Pruébalo en línea!
Una modificación de mi respuesta al desafío anterior . Esto solo genera todos los resultados posibles, los suma y cuenta los resultados.
Por diversión, podríamos escribirlo como
Tally@*Total@*Thread@*Tuples@*Range
, pero eso es más largo.Wolfram Language (Mathematica) , 41 bytes
Pruébalo en línea!
Este es el enfoque basado en convolución (aquí, tomamos convoluciones a través del producto de funciones generadoras -
1+x+x^2+...+x^(N-1)
es la función generadora para lanzar un dN - y luego tomamos la lista de coeficientes). Lo incluyo porque la primera solución no es práctica para entradas grandes.fuente
Mathematica, 44 bytes
Emite las frecuencias etiquetadas con las sumas correspondientes.
Pruébalo en línea!
-5 bytes de Martin Ender
gracias a Misha Lavrov por informarme que "etiquetado" es válido
fuente
Pyth , 12 bytes
Pruébalo aquí!
¿Cómo?
fuente
Jalea , 14 bytes
Pruébalo en línea!
La entrada es una lista de valores de troquel. Podría jugar golf al robar
ĠL€
de la otra respuesta de Jelly, pero también podría jugar golf la primera mitad y terminar con lo mismo, así que lo dejaré como está.fuente
Python 2 ,
120119 bytesPruébalo en línea!
Gracias por Mego / Jonathon Allan por 1 byte.
fuente
05AB1E , 11 bytes
Pruébalo en línea!
Cómo funciona
¡Guardado 1 byte gracias a Emigna !
fuente
O
lugar de€˜
R , 51 bytes
Pruébalo en línea!
Toma una lista de dados y devuelve un vector de frecuencias con nombre; Los nombres (valores de las sumas de los dados) están impresos sobre las frecuencias.
R , 59 bytes
Pruébalo en línea!
Un
Reduce
enfoque en lugar del iterativo anterior.R , 62 bytes
Pruébalo en línea!
Un enfoque de convolución. Le dará algunas advertencias de que solo está usando el primer elemento de
D
para la expresión,1:D
pero no afecta la salida. Si no tuviéramos que tomar laRe
parte completa de la solución, serían 58 bytes.fuente
APL (Dyalog Classic) ,
1210 bytes-2 gracias a @ Adám
Pruébalo en línea!
la entrada
⎕
es una lista de N dados⍳⍵
es una matriz N-dimensional de vectores anidados: todos los posibles lanzamientos de dados+/↑,
aplana las matrices y suma los lanzamientos⊢∘≢⌸
cuenta cuántos de cada suma única, enumerados en orden de su primera aparición, que afortunadamente coincide con su orden crecientefuente
⊢∘≢⌸+/↑,⍳⎕
Ruby , 72 bytes
Pruébalo en línea!
Toma una lista de dados como entrada. Sin duda se puede jugar golf, pero no está mal.
fuente
Pari / GP , 37 bytes
Pruébalo en línea!
fuente
Limpio ,
15414213610710085 + 13 = 98 bytesLa entrada es una lista de dados.
La respuesta es en forma de lambda.
+13 bytes de
import StdEnv
, que importa el módulo necesario para que esto funcione.Pruébalo en línea!
fuente
JavaScript (ES6), 83 bytes
Toma la entrada de cada dado como un parámetro separado.
fuente
JavaScript (ES6),
7674 bytesToma entrada como una lista de dados.
Casos de prueba
El procesamiento de los dos últimos casos de prueba requeriría habilitar TCO o aumentar el límite de tamaño de pila predeterminado del motor JS.
Mostrar fragmento de código
Formateado y comentado
NB: Esta es una versión comentada de mi envío inicial que usaba reduce (). Es 2 bytes más largo pero más fácil de leer.
fuente
Clojure, 96 bytes
La primera entrada es una lista de la cantidad de dados, y la segunda entrada es una lista de la cantidad de lados en cada dado.
fuente
Perl 5 , 94 bytes
Pruébalo en línea!
El formato de entrada es una lista de dados separados por nuevas líneas. Por lo tanto, 1d10 + 2d8 ingresaría como:
fuente
SageMath, 46 bytes
Pruébalo en línea
Esta es una adaptación de mi solución al otro desafío . Toma cualquier número de dados como parámetros (por ejemplo,
f(4,4,6,6,6)
para2d4+3d6
) y devuelve una lista.Python 2 + NumPy , 62 bytes
Pruébalo en línea!
Como antes, he incluido esta solución con la anterior, ya que son esencialmente equivalentes. Tenga en cuenta que esta función devuelve una matriz NumPy y no una lista de Python, por lo que la salida se ve un poco diferente si lo
print
hace.numpy.ones(x)
es la forma "correcta" de hacer una matriz para usar con NumPy y, por lo tanto, podría usarse en lugar de[x*[1]]
, pero desafortunadamente es mucho más larga.fuente