Dados dos enteros positivos a
y b
, b
genera la distribución de frecuencia de los a
tiempos de un dado rodando y sumando los resultados.
Una distribución de frecuencia enumera la frecuencia de cada suma posible si cada secuencia posible de tiradas de dados ocurre una vez. Por lo tanto, las frecuencias son enteros cuya suma es igual b**a
.
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.
Casos de prueba
Formato: a b: output
1 6: [1, 1, 1, 1, 1, 1]
2 6: [1, 2, 3, 4, 5, 6, 5, 4, 3, 2, 1]
3 6: [1, 3, 6, 10, 15, 21, 25, 27, 27, 25, 21, 15, 10, 6, 3, 1]
5 2: [1, 5, 10, 10, 5, 1]
6 4: [1, 6, 21, 56, 120, 216, 336, 456, 546, 580, 546, 456, 336, 216, 120, 56, 21, 6, 1]
10 10: [1, 10, 55, 220, 715, 2002, 5005, 11440, 24310, 48620, 92368, 167860, 293380, 495220, 810040, 1287484, 1992925, 3010150, 4443725, 6420700, 9091270, 12628000, 17223250, 23084500, 30427375, 39466306, 50402935, 63412580, 78629320, 96130540, 115921972, 137924380, 161963065, 187761310, 214938745, 243015388, 271421810, 299515480, 326602870, 351966340, 374894389, 394713550, 410820025, 422709100, 430000450, 432457640, 430000450, 422709100, 410820025, 394713550, 374894389, 351966340, 326602870, 299515480, 271421810, 243015388, 214938745, 187761310, 161963065, 137924380, 115921972, 96130540, 78629320, 63412580, 50402935, 39466306, 30427375, 23084500, 17223250, 12628000, 9091270, 6420700, 4443725, 3010150, 1992925, 1287484, 810040, 495220, 293380, 167860, 92368, 48620, 24310, 11440, 5005, 2002, 715, 220, 55, 10, 1]
5 50: [1, 5, 15, 35, 70, 126, 210, 330, 495, 715, 1001, 1365, 1820, 2380, 3060, 3876, 4845, 5985, 7315, 8855, 10626, 12650, 14950, 17550, 20475, 23751, 27405, 31465, 35960, 40920, 46376, 52360, 58905, 66045, 73815, 82251, 91390, 101270, 111930, 123410, 135751, 148995, 163185, 178365, 194580, 211876, 230300, 249900, 270725, 292825, 316246, 341030, 367215, 394835, 423920, 454496, 486585, 520205, 555370, 592090, 630371, 670215, 711620, 754580, 799085, 845121, 892670, 941710, 992215, 1044155, 1097496, 1152200, 1208225, 1265525, 1324050, 1383746, 1444555, 1506415, 1569260, 1633020, 1697621, 1762985, 1829030, 1895670, 1962815, 2030371, 2098240, 2166320, 2234505, 2302685, 2370746, 2438570, 2506035, 2573015, 2639380, 2704996, 2769725, 2833425, 2895950, 2957150, 3016881, 3075005, 3131390, 3185910, 3238445, 3288881, 3337110, 3383030, 3426545, 3467565, 3506006, 3541790, 3574845, 3605105, 3632510, 3657006, 3678545, 3697085, 3712590, 3725030, 3734381, 3740625, 3743750, 3743750, 3740625, 3734381, 3725030, 3712590, 3697085, 3678545, 3657006, 3632510, 3605105, 3574845, 3541790, 3506006, 3467565, 3426545, 3383030, 3337110, 3288881, 3238445, 3185910, 3131390, 3075005, 3016881, 2957150, 2895950, 2833425, 2769725, 2704996, 2639380, 2573015, 2506035, 2438570, 2370746, 2302685, 2234505, 2166320, 2098240, 2030371, 1962815, 1895670, 1829030, 1762985, 1697621, 1633020, 1569260, 1506415, 1444555, 1383746, 1324050, 1265525, 1208225, 1152200, 1097496, 1044155, 992215, 941710, 892670, 845121, 799085, 754580, 711620, 670215, 630371, 592090, 555370, 520205, 486585, 454496, 423920, 394835, 367215, 341030, 316246, 292825, 270725, 249900, 230300, 211876, 194580, 178365, 163185, 148995, 135751, 123410, 111930, 101270, 91390, 82251, 73815, 66045, 58905, 52360, 46376, 40920, 35960, 31465, 27405, 23751, 20475, 17550, 14950, 12650, 10626, 8855, 7315, 5985, 4845, 3876, 3060, 2380, 1820, 1365, 1001, 715, 495, 330, 210, 126, 70, 35, 15, 5, 1]
b
es al menos 2? (O si no, ¿cómo debería ser la lista de frecuencias para las sumas de un dado de 1 cara?)Respuestas:
Octava , 38 bytes
Pruébalo en línea!
Explicación
Agregar variables aleatorias independientes corresponde a convolucionar sus funciones de masa de probabilidad (PMF), o multiplicar sus funciones características (CF). Por lo tanto, la CF de la suma de
a
variables independientes, distribuidas idénticamente, está dada por la de una sola variable elevada a la potencia dea
.La CF es esencialmente la transformada de Fourier de la PMF y, por lo tanto, se puede calcular a través de una FFT. El PMF de un solo
b
troquel -sided es uniforme en1
,2
, ...,b
. Sin embargo, se requieren dos modificaciones:1
se usa en lugar de los valores de probabilidad reales (1/b
). De esta forma, el resultado se desnormalizará y contendrá enteros según sea necesario.a*b-a+1
) y el comportamiento periódico implícito asumido por la FFT no afecta los resultados.Una vez que se ha obtenido la función característica de la suma, se utiliza una FFT inversa para calcular el resultado final, y se aplica el redondeo para corregir las imprecisiones de punto flotante.
Ejemplo
Considere insumos
a=2
,b=6
. El códigoa:a*b<a+b
crea un vector conb=6
unos, rellenado con ceros a medidaa*b-a+1
:Luego
fft(...)
daAquí casi se puede reconocer la función sinc (transformada de Fourier de un pulso rectangular).
(...).^a
levanta cada entradaa
y luegoifft(...)
toma la FFT inversa, que daAunque los resultados en este caso son exactamente enteros, en general puede haber errores relativos del orden de
1e-16
, por lo queround(...)
es necesario.fuente
Mathematica, 29 bytes
Solo genera todas las tiradas de dados posibles, toma sus totales, luego cuenta. Cada frecuencia viene etiquetada con su valor.
Mathematica, 38 bytes
Expande
(1+x+x^2+...+x^(a-1))^b
y toma los coeficientes dex
. Dado que1+x+x^2+...+x^(a-1)
es la función generadora de un solo dado y los productos corresponden a convoluciones (sumando valores de dados), el resultado proporciona la distribución de frecuencias.fuente
Haskell ,
90797775 bytesGracias a Lynn por el truco del producto cartesiano . -11 bytes gracias a muchos trucos de Haskell de Funky Computer Man, -2 bytes de nombres, -2 bytes gracias a Laikoni. Sugerencias de golf son bienvenidas! Pruébalo en línea!
Sin golf
fuente
$
lugar de()
para guardar 2 bytes. TIOreplicate
(map length$)=(length<$>)
por dos bytesPyth - 10 bytes
Simplemente toma todas las combinaciones posibles de dados tomando el producto cartesiano de
[1, b]
,a
tiempos, sumando y obteniendo la longitud de cada grupo de suma.Test Suite .
fuente
05AB1E , 8 bytes
Pruébalo en línea!
¿Cómo?
fuente
R , 58 bytes
Pruébalo en línea!
fuente
R , 52 bytes
Pruébalo en línea!
Un puerto de la solución Octave de @Luis Mendo ,
fft(z, inverse=T)
desafortunadamente , devuelve la FFT inversa no normalizada, por lo que tenemos que dividir por la longitud, y devuelve uncomplex
vector, por lo que tomamos solo la parte real.fuente
cmdscale
me imagino :-)SageMath, 40 bytes
Pruébalo en línea
convolution
calcula la convolución discreta de dos listas.reduce
Hace lo que dice en la lata.[1]*b
es una lista deb
1
s, la distribución de frecuencias de1db
.[[1]*b]*a
hace una lista anidada dea
copias deb
1
s.Python 2 + NumPy , 56 bytes
Pruébalo en línea!
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((a,b))
es la forma "correcta" de hacer una matriz para usar con NumPy y, por lo tanto, podría usarse en lugar de[[1]*b]*a
, pero desafortunadamente es más larga.fuente
Jalea , 5 bytes
Pruébalo en línea!
Tenga en cuenta que esto toma los argumentos en orden inverso.
¿Cómo?
Soluciones alternativas:
fuente
Python 2 ,
10291 bytesPruébalo en línea!
fuente
Haskell , 61 bytes
Pruébalo en línea! Usar como
a#b
.En parte basado en la respuesta Haskell de Sherlock9 .
fuente
MATL , 9 bytes
El mismo enfoque que la respuesta Pyth de Maltysen .
Las entradas están en orden inverso. Pruébalo en línea!
fuente
Pari / GP , 28 bytes
Pruébalo en línea!
fuente
Perl 5 , 53 bytes
Pruébalo en línea!
Formato de entrada:
fuente
JavaScript (ES6), 94 bytes
Limitado por un desbordamiento de enteros de 32 bits, pero en su lugar se podrían usar flotantes a un costo de 1 byte.
fuente
J ,
25 24 2120 bytesPruébalo en línea!
Inicialmente incrementé la lista [0..n-1] para obtener [1..n] pero aparentemente no es necesario.
fuente
#/.~@,@(+///)@$i.@{:
. Parece que debería haber una manera de reducirlo un poco más haciendo que el verbo sea diádico, pero no pude hacerlo./
en+//
Javascript (ES6), 89 bytes
Toma la entrada en la sintaxis curry en orden inverso
f(b)(a)
fuente
En realidad ,
1312 bytes-1 byte gracias al Sr. Xcoder. Pruébalo en línea!
Sin golf
fuente
@
, ¿verdad?R∙♂Σ╗╜╔⌠╜c⌡M
AWK , 191 bytes
Emite frecuencias como una columna vertical.
Pruébalo en línea!
Agregar 6 bytes más permite múltiples conjuntos de entradas.
Pruébalo en línea!
fuente
Clojure, 86 bytes
Un ejemplo:
fuente
C (gcc) , 142 bytes
Pruébalo en línea!
fuente
sizeof(int)
? De Verdad?8
funcionaría en cualquier arquitectura, sobreasignando un poco, pero está bien.r[0]=1;for(i=1;i<=a;i++)for(j=i*~-b;
->for(i=r[0]=1;i<=a;)for(j=i++*~-b;
para -2 bytes.Julia , 43 bytes
Pruébalo en línea!
fuente