Introdução
Vamos observar a seguinte sequência (números inteiros não negativos):
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, ...
Por exemplo, vamos pegar os três primeiros números. Estes são 0, 1, 2
. Os números usados nesta sequência podem ser ordenados de seis maneiras diferentes:
012 120
021 201
102 210
Então, digamos que F (3) = 6 . Outro exemplo é F (12) . Este contém os números:
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
Ou a versão concatenada:
01234567891011
Para encontrar o número de maneiras de reorganizar isso, primeiro precisamos examinar o comprimento dessa string. O comprimento dessa string é 14
. Então calculamos 14! . No entanto, por exemplo, eles podem trocar de lugar sem interromper a sequência final. Existem 2 zeros, então existem 2! maneiras de trocar os zeros sem interromper o pedido. Existem também 4, então existem 4! maneiras de mudar esses. Dividimos o total por estes dois números:
Isso tem 14! / (4! × 2!) = 1816214400 maneiras de organizar a sequência 01234567891011
. Portanto, podemos concluir que F (12) = 1816214400 .
A tarefa
Dado N , saída F (N) . Para aqueles que não precisam da introdução. Para calcular F (N), primeiro concatenamos os primeiros N números inteiros não negativos (por exemplo, para N = 12, a sequência concatenada seria 01234567891011
) e calculamos o número de maneiras de organizar essa sequência.
Casos de teste
Input: Output:
0 1
1 1
2 2
3 6
4 24
5 120
6 720
7 5040
8 40320
9 362880
10 3628800
11 119750400
12 1816214400
13 43589145600
14 1111523212800
15 30169915776000
Nota
O cálculo da resposta deve ser calculado dentro de um prazo de 10 segundos ; a força bruta é proibida .
Isso é código-golfe , então a submissão com a menor quantidade de bytes ganha!
10
correta? Parece que deve ser menor que 10 !, pois é aí que os dígitos repetidos começam.10
dígitos são0, 1, 2, 3, 4, 5, 6, 7, 8, 9
. Dez dígitos diferentes, então o resultado é 10 !.0
caso estava jogando fora minha conta (estúpidas cordas vazias).F(N)
não éO(N!)
e quelog F(N)
éO(log N!)
, mas esses são apenas palpites ...Respostas:
Geléia,
1715 bytesExperimente online! ou verifique todos os casos de teste de uma só vez .
Como funciona
fonte
ES6,
1188178 bytesAlguém pode me dizer que há uma maneira mais curta de concatenar os números até
n
.Economizou 37 bytes legais, pegando a idéia de @ edc65 e executando-a em esteróides. (Salve um byte extra usando '|' em vez de,
&&
mas isso limita o resultado a 31 bits.)Editar: salvou mais 3 bytes novamente graças a @ edc65.
fonte
reduce
:n=>[...[...Array(n).keys()].join``].reduce((r,c,i)=>r*++i/(o[c]=-~o[c]),1,o=[])
n=>[...[...Array(n).keys()].join``].map(c=>r/=(o[c]=-~o[c])/i++,o=[],i=r=1)&&r
r/=(...)/i++
é mais preciso do quer*=i++/(...)
? Esse é o golfe mais ridículo que eu já vi!APL (Dyalog Extended) , 13 bytes
Experimente online!
Um programa completo. Usos
⎕IO←0
.Como funciona
O cálculo multinomial deriva do seguinte fato:
fonte
MATL , 21 bytes
Experimente online!
Explicação
fonte
Python 2,
14213710197 bytes(Obrigado @adnan pela sugestão sobre
input
)(Aplicou o cálculo incremental da versão C )
Versão original usando fatorial
Realmente, o único jogo de golfe acima é chamar
math.factorial
F
e deixar alguns espaços, portanto, provavelmente há uma solução python mais curta.Se for necessária explicação,
v
mantenha uma contagem da frequência de cada dígito; a contagem é atualizada para cada dígito em cada número no intervalo indicado.Na versão original, calculamos o número de permutações usando a fórmula padrão (Σf i )! / Π (f i !). Para a versão atual, esse cálculo é feito de forma incremental, distribuindo as multiplicações e divisões conforme vemos os dígitos. Pode não ser óbvio que a divisão de números inteiros será sempre exata, mas é fácil provar com base na observação de que cada divisão
k
deve seguirk
multiplicações de números inteiros consecutivos; portanto, uma dessas multiplicações deve ser divisível pork
. (Isso é uma intuição, não uma prova.)A versão original é mais rápida para argumentos grandes porque faz apenas 10 divisões bignum. Embora dividir um bignum por um número inteiro pequeno seja mais rápido do que dividir um bignum por um bignum, quando você tem milhares de bignum divididos, fica um pouco lento.
fonte
Python 2, 197 bytes (editar: salvou 4 bytes, obrigado Thomas Kwa!)
Ungolfed:
fonte
range(0,10)
pode serrange(10)
.CJam,
2119 bytesTeste aqui.
Explicação
fonte
JavaScript (ES6), 100
Teste
fonte
k[c]=~-k[c]
sinônimo de--k[c]
?Pitão, 18 bytes
Experimente online: Demonstração
fonte
Haskell, 92 bytes
Exemplo de uso:
h 12
->1816214400
.Como funciona
fonte
C,
236174138121 bytesMuito crédito para os rici, pela redução maciça de bytes.
Ungolfed
Experimente aqui .
fonte
#define L long long L d;i,j,k,m,n,s=1,b[10]={1};L f(n){return n?n*f(n-1):1;}main(d){for(scanf("%d",&n);i<n;)for(j=i++;j;j/=10)++b[j%10],++s;for(;m<10;)d*=f(b[m++]);printf("%Ld",f(s)/d);}
for(;m<10;)s+=b[m],d*=f(b[m++])
mas acho que são mais alguns bytes.C / bc,
233121112 bytes (assumindo penalidade de 3 bytes|bc
)Inspirado por Cole Cameron, removeu a manipulação de caracteres hacky e apenas faz aritmética no valor do argumento.
Alterado para scanf usando o vetor arg.
Necessidades
bc
realmente fazer o cálculo de precisão arbitrário.Ungolfed e aviso livre:
Ilustrado (que eu confio mostra o algoritmo):
E, com o tubo através de bc (e adicionando o cálculo de F (1000):
Isso calculou F (5000) - um número de 18.592 dígitos - em menos de 10 segundos.
fonte
Perl 6, 117 bytes
e em um fasion mais legível
fonte
Perl 5, 108 bytes
Muito obrigado a dev-null por me salvar 17 bytes e a japhy pela idéia fatorial.
fonte
05AB1E ,
131211 bytesExperimente online!
fonte
Python 2 , 123 bytes
Experimente online!
range
entrada em uma única sequênciafonte
PowerShell, 125 bytes
Pega entrada
$args[0]
, subtrai1
, cria um intervalo de números inteiros a partir0..
desse número,-join
s que juntos em uma string e salva como$b
. Pegamos a.Length
string, construímos outro intervalo a partir1..
desse comprimento,-join
esses números inteiros juntos e*
, em seguida, canalizamos isso paraInvoke-Expression
(semelhante aeval
). Em outras palavras, construímos o fatorial do comprimento da sequência numérica com base na entrada. Esse é o nosso numerador.Nós dividimos isso
/
por ...Nosso denominador, que é construído pegando um intervalo
0..9
e enviando-o através de um loop for|%{...}
. A cada iteração, definimos uma variável auxiliar$c
igual ao número de vezes que o dígito atual$_
aparece dentro,$b
graças à chamada do .NET[regex]::matches
associada ao.count
atributo Em seguida, construímos um novo intervalo1..
até esse valor, desde que não seja zero. Sim, em muitos casos, isso resultará em um intervalo1..1
, que é avaliado apenas1
. Nós levamos todos-join
eles e eles juntos*
e depois canalizamos paraInvoke-Expression
novamente. Em outras palavras, construímos o produto dos fatoriais do número de ocorrências de cada dígito.NB
Lida com entradas
90
sem problemas e em menos de um segundo.... além disso resulta em
Infinity
saída, pois o comprimento da string permutável resulta no170!
qual se encaixa nodouble
tipo de dados (7.25741561530799E+306
), mas171!
não. O PowerShell tem uma ... peculiaridade ... que faz a conversão automática automaticamente de[int]
para[double]
no caso de estouro (desde que você não tenha explicitamente convertido a variável para começar). Não, não sei por que ele não é usado[long]
para valores inteiros.Se fizermos alguma conversão e manipulação explícitas (por exemplo, usar
[uint64]
números inteiros de 64 bits não assinados), poderíamos obter um valor mais alto, mas isso aumentaria significativamente o código, pois precisaríamos atingir até 170 comprimentos com condicionais e, em seguida, reformular cada multiplicação a partir daí. Como o desafio não especifica um intervalo superior, presumo que isso seja adequado.fonte
Perl6
Bastante não-destruído no momento - precisa dormir agora.
fonte
Groovy, 156 bytes
Minha humilde primeira solução Code Golf. Você pode testá-lo aqui.
E aqui está uma versão mais legível:
Bem direto, mas havia alguns destaques para mim:
Executando uma injeção / redução de uma matriz de
chars
para aMap<Character, Integer>
. Isso ainda foi um pouco complicado pela falta de um valor padrão para os valores do mapa. Essa dúvida é possível, mas se o mapa padronizar todos os valores para 0, eu poderia evitar o ternário necessário para evitar um NPE.O operador de expansão Groovy (por exemplo,
}*.value
) é sempre divertido de usarNo aspecto irritante, porém, havia a necessidade de declarar a função fatorial com o tipo de retorno
BigInteger
. Fiquei com a impressão de que o Groovy colocou todos os números emBigInteger
orBigDecimal
, mas talvez não seja esse o caso quando se trata de retornar tipos. Vou ter que experimentar mais. Sem esse tipo de retorno explicitamente declarado, obtemos valores fatoriais incorretos muito rapidamente.fonte
J, 33 bytes
Converte o intervalo em uma sequência de dígitos, conta cada dígito e aplica o coeficiente multinomial para calcular o resultado.
Uso
fonte
R, 118 bytes
Cerca de 8 meses atrasado para a festa, mas pensei em tentar, porque parecia um desafio interessante.
Experimente no R-fiddle
Explicado
0 ... n-1
e recolha-o em uma sequência:paste(1:n-1,collapse="")
x
):x=as.numeric(el(strsplit(...,"")))
factorial(sum(1|x))
que é apenas#digits!
Para calcular o denominador, utilizamos
table
para construir uma tabela de contingência que lista as frequências. No caso de F (12), a tabela gerada é:O que significa que podemos usar o uso
factorial()
(que por sinal é vetorizado) na contagem e simplesmente levar o produto:prod(factorial(table(x)))
Nota: os passos 4 e 5 são realizados somente se
n>0
retornar1
.fonte
Mathematica, 65 bytes
Provavelmente poderia ser jogado ainda mais.
fonte
Ruby , 64 bytes
Experimente online!
fonte
Stax , 12 bytes
Execute e depure-o em staxlang.xyz!
Descompactado (14 bytes) e explicação:
fonte
Gelatina , 11 bytes
Resposta de Jelly Golfed Dennis '15 byte ...
Um link monádico que aceita um número inteiro não negativo que gera um número inteiro positivo.
Experimente online! Ou veja a suíte de testes .
Quão?
fonte
Python 2 , 190 bytes
Experimente online!
fonte
Python 2 , 134 bytes
Experimente online!
Uma abordagem alternativa ...
fonte