¡Es hora de otro desafío fácil en el que todos puedan participar!
El teorema multinomial establece:
La expresión entre paréntesis es el coeficiente multinomial, definido como:
Permitir que los términos k i a la gama de más de todas las particiones de enteros de n da la n -ésima nivel de de Pascal m -simplex. Su tarea es calcular este coeficiente.
Tarea
Escriba un programa o función que tome m números, n , k 1 , k 2 , ..., k m-1 , y genere o devuelva el coeficiente multinomial correspondiente. Su programa puede tomar opcionalmente m como argumento adicional si es necesario. Tenga en cuenta que k m no está en la entrada.
Estos números pueden ingresarse en cualquier formato que le guste, por ejemplo, agrupados en listas o codificados en unario, o cualquier otra cosa, siempre que su código realice el cálculo real del coeficiente multinomial, y no el proceso de codificación.
El formato de salida es igualmente flexible.
Todo el código debe ejecutarse en menos de un minuto para n y m hasta 1000.
No te preocupes por el desbordamiento de enteros.
No están permitidos los elementos integrados diseñados para calcular el coeficiente multinomial.
Se aplican lagunas estándar.
Tanteo
Este es el código de golf: la solución más corta en bytes gana.
Casos de prueba
Input: 3, [2, 0]
Output: 3
Input: 3, [1, 1]
Output: 6
Input: 11, [1, 4, 4]
Output: 34650
Input: 4, [1,2]
Output: 12
Input: 15, [5,4,3,2]
Output: 37837800
Input: 95, [65,4,4]
Output: 1934550571913396675776550070308250
Input: 32, [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]
Output: 4015057936610313875842560000000
Input: 15, [3,3,3,3]
Output: 168168000
Input: 1000, [10,10,10,10,10,10,10,10,10,10,100,100,100,100,100,100,100,100]
Output: 1892260836114766064839886173072628322819837473493540916521650371620708316292211493005889278395285403318471457333959691477413845818795311980925098433545057962732816261282589926581281484274178579110373517415585990780259179555579119249444675675971136703240347768185200859583936041679096016595989605569764359198616300820217344233610087468418992008471158382363562679752612394898708988062100932765563185864346460326847538659268068471585720069159997090290904151003744735224635733011050421493330583941651019570222984959183118891461330718594645532241449810403071583062752945668937388999711726969103987467123014208575736645381474142475995771446030088717454857668814925642941036383273459178373839445456712918381796599882439216894107889251444932486362309407245949950539480089149687317762667940531452670088934094510294534762190299611806466111882595667632800995865129329156425174586491525505695534290243513946995156554997365435062121633281021210807821617604582625046557789259061566742237246102255343862644466345335421894369143319723958653232683916869615649006682399919540931573841920000000000000
Input: 33, [17]
Output: 1166803110
Input: 55, [28]
Output: 3824345300380220
fuente
1934550571913396675776550070308250
, ¿podemos dar salida1.9345505719133966e+33
?[1000 {999 ones}]
en absoluto, porque el exponente está mucho más allá de lo que pueden representar las flotantes de 64 bits. (Los flotantes de 128 bits probablemente serán suficientes, pero supongo que desea usar el tipo de número nativo de JavaScript?)Respuestas:
Gelatina ,
76 bytesMira ma, no Unicode! Este programa toma una sola lista como entrada, con n en su primer índice.
Pruébalo en línea! o verificar todos los casos de prueba a la vez .
Cómo funciona
fuente
CJam, 11 bytes
Ingrese como una lista única con
n
primero:Este asas insumos hasta
n
ym
1000 casi al instante.Pruébalo aquí.
Explicación
fuente
MATL , 21
15bytesPongamos la función log-gamma en buen uso. Esto evita el desbordamiento interno al trabajar con logaritmos de factoriales, no con factoriales en sí.
Esto funciona en la versión actual (9.2.2) del lenguaje / compilador, que es anterior a este desafío.
Las entradas son: primero un número, luego un vector numérico. El resultado se produce como a
double
, lo que limita la salida máxima a algún lugar alrededor2^52
.Ejemplo
Explicación
fuente
PowerShell,
9174 bytes¡Cortejar! ¡Mi respuesta número 100 en PPCG!
Uf. No voy a ganar el código más corto, eso es seguro. Sin embargo, utiliza un par de buenos trucos con rangos. Y esto es probablemente una tontería completa para cualquiera que no esté familiarizado con PowerShell.
Explicación
Primero tomamos información con
param($n,$k)
y esperamos$k
ser una matriz, por ejemplo.\compute-the-multinomial-coefficient.ps1 11 @(1,4,4)
.Comenzaremos con el numerador (todo a la izquierda de
/
). Eso es simplemente un rango desde el1..$n
que se ha-join
editado junto con*
y luego evaluadoiex
para calcular el factorial (es decir,1*2*3*...*$n
).A continuación, un bucle sobre
$k|%{...}
y cada iteración se resta el valor actual$_
de$n
(que no se preocupan más) para formular$k_m
más tarde. Además, generamos el rango de1..$k_i
cada iteración, que se deja en la tubería. Esos objetos de canalización se concatenan en matriz con la segunda expresión, rango1..$n
(que se encuentra$k_m
en este punto). Todo eso finalmente se-join
edita*
y evalúa coniex
, similar al numerador (esto funciona porquex! * y! = 1*2*3*...*x * 1*2*3*...*y
, por lo que no nos importa el orden individual).Finalmente,
/
sucede que el numerador se divide por el denominador y la salida.Maneja la salida correctamente para números más grandes, ya que no estamos emitiendo explícitamente ninguna variable como ningún tipo de datos en particular, por lo que PowerShell volverá a emitir silenciosamente como diferentes tipos de datos sobre la marcha, según sea necesario. Para los números más grandes, salidas a través de notación científica para preservar mejor las cifras significativas a medida que los tipos de datos se vuelven a emitir. Por ejemplo,
.\compute-the-multinomial-coefficient.ps1 55 @(28)
saldrá3.82434530038022E+15
. Supongo que esto está bien dado que "El formato de salida es igualmente flexible" se especifica en el desafío y en los comentarios de quintopia "Si el resultado final puede caber dentro de los tipos enteros soportados de forma nativa, entonces el resultado debe ser preciso. Si no puede, hay no hay restricción sobre lo que se puede generar ".Alternativamente
Dependiendo de las decisiones de formato de salida, lo siguiente en 92 bytes
Que es la misma que la anterior, simplemente usa la salida explícita formatear con
.ToString('G17')
para conseguir el número deseado de dígitos. Para55 @(28)
esto saldrá3824345300380220.5
Edit1: ahorró 17 bytes deshaciéndolo
$d
y calculándolo directamente, y deshaciéndolo del cálculo$k_m
al encadenarlo mientras realizamos el bucle$k
Edit2: se agregó una versión alternativa con formato explícito
fuente
APL (Dyalog Extended) , 9 bytes
Pruébalo en línea!
Usando la idea de mi respuesta APL en otro desafío que involucra a los multinomiales .
Una función tácita cuyo argumento izquierdo es la lista de k, y el argumento derecho es n. Los casos de prueba verifican si está de acuerdo con la solución de Adam con los argumentos izquierdo y derecho invertidos.
Cómo funciona
fuente
Mathematica, 26 bytes
Ejemplo:
fuente
Pitón 3,
9391Gracias a Dennis y FryAmTheEggman .
n
como entero,k
como iterable.Sin golf:
fuente
95, [65, 4, 4]
. Tenga en cuenta que la entrada no contiene k_m . 2. Parece que no estás usandofrom functools import*
nada.reduce
. 2.import math;f=math.factorial
guarda un byte. 3. Python 2 permitiría a deshacerse de la segunda/
en//
.f
en su propia ahorra algunos bytes :f=lambda x:0**x or x*f(x-1)
.APL (Dyalog Unicode) , SBCS de 16 bytes
Completamente basado en la habilidad matemática de mi colega Marshall .
Función de infijo anónimo. Toma k como argumento derecho yn como argumento izquierdo.
Pruébalo en línea!
{
...}
lambda anónimo;⍺
es argumento izquierdo ( n ) y⍵
argumento derecho ( k )0,⍵
anteponer un cero a k¯1↓
suelte el último elemento de ese+\
suma acumulativa de eso⍺-
restar eso de n⍵!
( k ) que×/
producto de esofuente
PARI / GP, 43 bytes
Muy claro; Aparte del formateo, la versión sin golf podría ser idéntica.
fuente
Matlab 48 bytes
Debe configurarlo
format
delong
antemano para obtener la mayor precisión. Entonces, es bastante sencillo:fuente
Pyth, 10 bytes
Pruébelo en línea: demostración
Explicación:
fuente
J, 16 bytes
Uso
Para valores mayores,
x
se usa un sufijo de para denotar enteros de precisión extendidos.Explicación
fuente
05AB1E , 8 bytes
Pruébalo en línea! Explicación:
Parece que no puedo encontrar mejores formas de realizar el paso 2 o el paso 4.
fuente
APL (Dyalog Unicode) , 17 bytes
Pruébalo en línea!
Función infija tácita (Gracias a @ Adám por los 2 bytes que guarda).
APL (Dyalog Unicode) , 19 bytes
Pruébalo en línea!
Infix Dfn.
Ambas funciones anteriores calculan la fórmula dada.
fuente
Haskell ,
5958 bytesPruébalo en línea!
¡Gracias a BMO por guardar 1 byte!
fuente
Clojure, 70 bytes
Crea una función anónima tomando todos los argumentos como una lista única, con
n
primero.Se desperdician 30 caracteres simplemente definiendo la maldita función factorial. Oh bien.
fuente
Perl 6 ,
5250 bytesPruébalo
Pruébelo (el resultado es un racional con denominador de 1)
Expandido:
fuente