Hora de outro desafio fácil, no qual todos podem participar!
A expressão entre parênteses é o coeficiente multinomial, definido como:
Permitindo que os termos de k i a variar ao longo de todas as partições inteiros de n dá o n -simo nível de de Pascal m -simplex. Sua tarefa é calcular esse coeficiente.
Tarefa
Escreva um programa ou função que pegue m números, n , k 1 , k 2 , ..., k m-1 e produz ou retorne o coeficiente multinomial correspondente. Seu programa pode opcionalmente considerar m como argumento adicional, se necessário. Observe que k m não está na entrada.
Esses números podem ser inseridos em qualquer formato que você queira, por exemplo, agrupado em listas ou codificado em unário ou qualquer outra coisa, desde que a computação real do coeficiente multinomial seja realizada pelo seu código, e não pelo processo de codificação.
O formato de saída é igualmente flexível.
Todo o código deve ser executado em menos de um minuto para n e m até 1000.
Não se preocupe com o excesso de números inteiros.
Built-ins projetados para calcular o coeficiente multinomial não são permitidos.
Aplicam-se brechas padrão.
Pontuação
Este é o código golf: A solução mais curta em bytes vence.
Casos de teste
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
fonte
1934550571913396675776550070308250
, podemos produzir1.9345505719133966e+33
?[1000 {999 ones}]
, porque o expoente está muito além do que os flutuadores de 64 bits podem representar. (Bóias de 128 bits provavelmente será suficiente, mas eu estou supondo que você quer usar tipo de número nativo do JavaScript?)Respostas:
Geléia ,
76 bytesOlha ma, não Unicode! Este programa usa uma única lista como entrada, com n em seu primeiro índice.
Experimente online! ou verifique todos os casos de teste de uma só vez .
Como funciona
fonte
CJam, 11 bytes
Insira como uma única lista com o
n
primeiro:Este alças entradas até
n
em
1000 praticamente instantaneamente.Teste aqui.
Explicação
fonte
MATL , 21
15bytesVamos usar bem a função log-gama . Isso evita o transbordamento interno ao trabalhar com logaritmos de fatoriais, não com os próprios fatoriais.
Isso funciona na versão atual (9.2.2) do idioma / compilador, anterior a esse desafio.
As entradas são: primeiro um número, depois um vetor numérico. O resultado é produzido como a
double
, o que limita a produção máxima para algo em torno de2^52
.Exemplo
Explicação
fonte
PowerShell,
9174 bytesUau! Minha 100ª resposta sobre PPCG!
Ufa. Não vai ganhar código mais curto, isso é certo. Usa alguns truques legais com intervalos, no entanto. E isso provavelmente é uma bobagem completa para quem não conhece o PowerShell.
Explicação
Primeiro, aceitamos
param($n,$k)
e esperamos$k
ser uma matriz, por exemplo.\compute-the-multinomial-coefficient.ps1 11 @(1,4,4)
.Começaremos com o numerador (tudo à esquerda de
/
). Isso é simplesmente um intervalo1..$n
que foi-join
editado*
e avaliado comiex
para calcular o fatorial (ou seja,1*2*3*...*$n
).Em seguida, vamos varrer
$k|%{...}
e cada iteração que subtrair o valor atual$_
da$n
(que não se preocupam mais) para formular$k_m
mais tarde. Além disso, geramos o intervalo a1..$k_i
cada iteração, que fica no pipeline. Esses objetos de pipeline são concatenados com a segunda expressão, range1..$n
(que está$k_m
neste momento). Tudo isso é finalmente-join
editado*
e avaliado comiex
, semelhante ao numerador (isso funciona porquex! * y! = 1*2*3*...*x * 1*2*3*...*y
, portanto, não nos importamos com pedidos individuais).finalmente, o
/
acontece é que o numerador é dividido pelo denominador e pela saída.Lida com a saída corretamente para números maiores, já que não estamos expressamente convertendo nenhuma variável como qualquer tipo de dados específico, portanto, o PowerShell silenciosamente reproduz novamente diferentes tipos de dados em tempo real, conforme necessário. Para os números maiores, as saídas via notação científica preservam melhor os números significativos à medida que os tipos de dados são relançados. Por exemplo,
.\compute-the-multinomial-coefficient.ps1 55 @(28)
será exibido3.82434530038022E+15
. Estou presumindo que isso esteja correto, dado que "O formato de saída é similarmente flexível" está especificado no desafio e nos comentários da quintopia "Se o resultado final puder caber nos tipos inteiros suportados nativamente, o resultado deverá ser preciso. Se não puder, não há restrição sobre o que pode ser produzido ".alternativamente
Dependendo das decisões de formatação da saída, o seguinte em 92 bytes
Que é o mesmo que o acima, apenas usa formatação de saída explícita com
.ToString('G17')
para alcançar o número desejado de dígitos. Para55 @(28)
isso irá produzir3824345300380220.5
Edit1 - Economizou 17 bytes, livrando-se
$d
e calculando-o diretamente, e livrando-se do cálculo$k_m
amarrando-o enquanto fazemos o loop$k
Edit2 - Adicionada versão alternativa com formatação explícita
fonte
APL (Dyalog Extended) , 9 bytes
Experimente online!
Usando a ideia da minha resposta APL em outro desafio que envolve multinomiais .
Uma função tácita cujo argumento à esquerda é a lista de k e o argumento à direita é n. Os casos de teste verificam se concorda com a solução de Adam com os argumentos esquerdo e direito invertidos.
Como funciona
fonte
Mathematica, 26 bytes
Exemplo:
fonte
Python 3,
9391Agradecimentos a Dennis e FryAmTheEggman .
n
como inteiro,k
como iterável.Ungolfed:
fonte
95, [65, 4, 4]
. Observe que a entrada não contém k_m . 2. Você parece não estar usandofrom functools import*
nada.reduce
. 2.import math;f=math.factorial
salva um byte. 3. Python 2 permitiria que você a se livrar do segundo/
no//
.f
em seu próprio salva alguns bytes :f=lambda x:0**x or x*f(x-1)
.APL (Dyalog Unicode) , 16 bytes SBCS
Totalmente baseado nas habilidades matemáticas do meu colega Marshall .
Função de infixo anônimo. Toma k como argumento certo e n como argumento esquerdo.
Experimente online!
{
...}
lambda anônima;⍺
é argumento à esquerda ( n ) e⍵
é argumento à direita ( k )0,⍵
acrescente um zero a k¯1↓
largar o último item desse+\
soma acumulada disso⍺-
subtrair isso de n⍵!
( k ) que×/
produto dissofonte
PARI / GP, 43 bytes
Bem direto; além da formatação, a versão não-gasta pode muito bem ser idêntica.
fonte
Matlab 48 bytes
Você precisa definir
format
comlong
antecedência para obter a maior precisão. Então, é bem direto:fonte
Pitão, 10 bytes
Experimente online: Demonstração
Explicação:
fonte
J, 16 bytes
Uso
Para valores maiores, um sufixo de
x
é usado para indicar números inteiros de precisão estendidos.Explicação
fonte
05AB1E , 8 bytes
Experimente online! Explicação:
Não consigo encontrar melhores maneiras de executar as etapas 2 ou 4.
fonte
APL (Dyalog Unicode) , 17 bytes
Experimente online!
Função Infix tácita (Graças a @ Adám pelos 2 bytes que ele salva.)
APL (Dyalog Unicode) , 19 bytes
Experimente online!
Infix Dfn.
Ambas as funções acima calculam a fórmula fornecida.
fonte
Haskell ,
5958 bytesExperimente online!
Obrigado ao BMO por economizar 1 byte!
fonte
Clojure, 70 bytes
Cria uma função anônima, recebendo todos os argumentos como uma única lista, com
n
primeiro.30 caracteres são "desperdiçados" apenas definindo a função fatorial. Ah bem.
fonte
Perl 6 ,
5250 bytesTeste-o
Teste (o resultado é um Rational com denominador 1)
Expandido:
fonte