Desafio
Nesta tarefa, você calculou o número de maneiras pelas quais podemos distribuir as bolas A nas células B, com cada célula tendo pelo menos uma bola.
As entradas A e B são fornecidas em uma única linha separada por um espaço em branco, as entradas são terminadas por EOF.
Você pode verificar suas soluções aqui .
Entrada
0 0
1 0
12 4
6 3
18 17
20 19
15 13
18 9
20 20
17 14
9 2
14 13
18 11
Resultado
1
0
14676024
540
54420176498688000
23112569077678080000
28332944640000
38528927611574400
2432902008176640000
21785854970880000
510
566658892800
334942064711654400
Restrições
- Todos os A e B podem ser distinguidos.
- 0 <= A, B <= 20
- Você pode usar qualquer idioma de sua escolha
- A solução mais curta vence!
code-golf
math
combinatorics
Quixotesco
fonte
fonte
S(n,0)
é1
sen=0
e0
não). Se você quiser, posso encontrar uma referência para a afirmação mais forte de que Stirling2 está no subgrupo associativo do grupo exponencial de Riordan.Respostas:
JavaScript (90
93)http://jsfiddle.net/RDGUn/2/
Obviamente, qualquer linguagem baseada em matemática, como a APL, me derrotará por causa da verbosidade da sintaxe e da falta de construções matemáticas internas :)
Editar Além disso, não tenho nenhuma funcionalidade relacionada à entrada, exceto os parâmetros passados para a função, não tenho certeza de como usar a entrada padrão com JavaScript ...
Editar: Mover
i--
param=m*
expressão; mudarn*=-1
parafor
; comecer=1
a combinar as tarefas e remova as estranhas no retorno. (economize 3 caracteres)fonte
readline
eprint
. Não sei o que os outros aqui usam.prompt
ealert
são o io "padrão" do JavaScript, pois são as chamadas io de bloqueio típicas, apesar de você nunca usar o bloqueio io com JavaScript.Golfscript -
56 50 49 48 41 40 3837 caracteresNota: ele lida com várias linhas de entrada, é rápido (1/8 segundos para executar os casos de teste) e não quebra para nenhuma entrada legal.
(A primeira versão também foi o meu primeiro programa Golfscript; agradeço ao eBusiness por apontar vários truques que perdi).
Para tornar este post educacional útil também, aqui está uma explicação de como ele funciona. Começamos com a recorrência
f(n, k) = k * (f(n-1, k) + f(n-1, k-1))
. Isso pode ser entendido combinatoricamente como dizer que, para colocarn
bolas distinguíveis emk
baldes distinguíveis, de modo que cada balde contenha pelo menos uma bola, você escolhe um dosk
baldes para a primeira bola (k *
) e, em seguida, conterá pelo menos mais uma bola (f(n-1, k)
) ou não vai (f(n-1, k-1)
).Os valores resultantes disso formam uma grade; tomando
n
como o índice de linha ek
como o índice da coluna e indexando ambos a partir de 0 começaEntão, voltando-se para o programa,
divide a entrada em linhas e, em seguida, para cada linha a avalia, colocando
n
ek
na pilha e, em seguida<<STUFF>>
, chama , da seguinte maneira:Este calcula as primeiras
k+1
entradas don+1
th linha dessa grade. Inicialmente, a pilha én k
.),
dá pilha den [0 1 2 ... k]
{!}%
dá pilha den [1 0 0 ... 0]
onde hák
0s.\{ <<MORE STUFF>> }*
traz an
ao topo e faz com que seja o número de vezes que executamos<<MORE STUFF>>
.Nossa pilha atualmente é uma linha da tabela:
[f(i,0) f(i,1) ... f(i,k)]
0.@
coloca um par de 0s antes dessa matriz. A primeira seráj
e a segunda seráf(i,j-1)
.{ <<FINAL LOOP>> }/
percorre os elementos da matriz; para cada um, coloca-o no topo da pilha e depois executa o corpo do loop..@+2$*@)@
é chato manipulação pilha para tomar... j f(i,j-1) f(i,j)
e rendimento... j*(f(i,j-1)+f(i,j)) j+1 f(i,j)
;;]
aparece fora a esquerda ao longok+1 f(i,k)
e reúne tudo em uma matriz, pronta para a próxima rodada.Finalmente, quando geramos a
n
quinta linha da tabela,)p;
pega o último elemento, o imprime e descarta o restante da linha.Para a posteridade, três soluções de 38 caracteres sobre esse princípio:
n%{~),{!}%\{0.@{.@+@.@*\)@}/;;]}*)p;}/
n%{~),{!}%\{0:x\{x\:x+1$*\)}/;]}*)p;}/
n%{~),{!}%\{0.@{@1$+2$*\@)}/;;]}*)p;}/
fonte
[0]
->1,
, o espaço após o zip pode ser removido e o outro espaço pode ser removido se você apenas armazenar em um operador em vez de k. Ainda não percorri seu código, mas suspeito que você possa se safar apenas de usar um valor sem colocá-lo em uma matriz em alguns pontos.J, 40
Por exemplo
<1 segundo para todos os casos de teste.
Editar% s
-/
vez de alternar(1 _1)*
(ideia de JB)1x+
fonte
1x+
então, mas isso só me devolve 1 personagem, enquanto você levou 5!Lisp comum (83)
Parece que deveria haver uma maneira mais curta de testar os casos básicos, mas nada me ocorre de imediato.
fonte
J, 38 a 42
Dependendo das suas preferências de rigor sobre idiomas interativos e apresentação de saída, faça a sua escolha no espectro J de soluções:
4 :'|-/(!&y*^&x)i.1x+y'/&".;._2(1!:1)3
Inicie o jconsole, insira-o e cole a entrada (termine com Cd). Você notará que a saída é separada por espaço (J é uma linguagem vetorial, ele executa a computação em toda a entrada como um todo e a retorna como um vetor 1D, cuja apresentação padrão é em uma única linha). Considero que ok, o espírito deste problema é computação, não apresentação. Mas se você insistir em ter novas linhas:
4 :'|-/(!&y*^&x)i.1x+y'/&.".;._2(1!:1)3
Substituir Compose (
&
) por Under (&.
) retorna um vetor de strings, cuja apresentação termina em linhas separadas.4 :'echo|-/(!&y*^&x)i.1x+y'/&".;._2(1!:1)3
execute a partir da linha de comandos como
$ jconsole balls.ijs < balls.in
Se você votou isso, você pode querer ir dar solução do Eelvex algum crédito também.
fonte
&.
para que ele funcione corretamente em modo interativo.4 :'|-/(!&y*^&x)i.1x+y'/&.".;._2(1!:1)3
. 39 caracteres.GolfScript -
453836 caracteresRelação de recorrência de implementação suja de força média (
3836 caracteres):A relação de recorrência que roubei da solução de Peter Taylors, é assim:
f(x, y) = y * ( f(x-1, y) + f(x-1, y-1) )
Com casos especiais, se qualquer variável for 0.
Minha implementação não reutiliza resultados anteriores, portanto, cada chamada de função ramifica para duas novas chamadas, a menos que um dos zero casos tenha sido alcançado. Isso dá o pior caso de chamadas de função 2 ^ 21-1, que levam 30 segundos na minha máquina.
Solução em série de força leve (45 caracteres):
fonte
J, 55 caracteres
wd
). Entrada em stdin, saída em stdout.Script de teste do Bash:
fonte
wd
fazem?echo
, que é definido como0 0&$@(1!:2&2)
. Não sei ao certo o que isso significa, mas faz algo como itens de classificação 1 de impressão bonita com uma quebra de linha. (Só agora estou percebendo que usa 2 em vez de 4 ... acho que ainda vai para stdout no modo console, pelo menos.)<< was unexpected at this time.
novo na entrada J, sempre o usei no modo console.Golfscript - 26 caracteres
Aviso: O gabinete do 12 4 precisa de muita memória (embora não tanto quanto a resposta abaixo) e demora um pouco para ser executado
Obviamente, esta resposta tem alguns problemas, mas vou deixar aqui porque os comentários se referem a ela e a resposta de mellamokb se baseia nela.
Golfscript - 24 caracteres
Aviso: O gabinete 12 4 precisa de muita memória e demora um pouco para ser executado
fonte
0 0
deve produzir1
;0 k
para qualquer outrok
deve produzir0
;n 1
paran > 0
deve produzir1
.Python 140 Chars
fonte
dc, 100 caracteres
Infelizmente, o dc não parece ser apoiado por ideona. Ainda pode haver um ou dois personagens, mas é hora de dormir.
Nota: isso suporta várias linhas de entrada, tem precisão suficiente para fornecer a saída correta mesmo para
20 19
(maldição, Perl, pelo tempo que perdi depurando minha solução!) E fornece a saída correta para0 0
.As sugestões da Nabb permitem encurtar pelo menos até
ao custo de deixar lixo nas pilhas de registradores (e, assim, ficar sem memória se calcularmos bilhões de respostas).
fonte
l11
é analisado comol1 1
(você pode usarK
como um token de caractere único,0
caso não mude a precisão). Você pode alterar o loop de entrada para?[...?z1=4]
. Você pode alinhar a macro no registro1
. E você provavelmente pode salvar mais personagens em geral, mas esperarei que seja mais curto para compreendê-lo.Golfe (28
3137)~):$\.($\?:@;?,{@+}%{$base$,\-[0]=},,
Modificação na
gnibbler
solução GolfScript. Eu acho que essa é uma solução funcional - testada com [3,2], [4,2], [6,3] e [9,2] com respostas corretas. (Eu usei$
e@
para variáveis para aumentar o espaço em torno dabase
palavra - chave).Existem dois problemas com
gnibbler
a solução atual.Editar
~:@\?:$,{$+}%{@base(;@,\-,0=},,
Melhor solução ainda! Não há necessidade de incrementar, basta adicionar a todos os números para que eles comecem com [1] e nenhum dígito estará faltando (incluindo o preenchimento à esquerda dos zeros) depois que você desconectar o primeiro dígito. Esta solução deve funcionar e foi testada com as mesmas entradas acima. Também é muito mais rápido, porque não estamos incrementando antes de pegar o expoente para gerar a matriz (mas ainda sofre do mesmo problema de desempenho / memória para entradas maiores).
Editar : use
gnibbler
a idéia de mover a adição de$
dentro do filtro em vez de uma etapa extra. (economize 3 caracteres).fonte
0 0
.n 1
para qualquer n, faz com que ele trave. hmm ..05AB1E , 19 bytes
NOTA: É extremamente lento e já atinge o tempo limite
12 4
. Está funcionando como pretendido, no entanto.Vou ver se consigo criar um método alternativo que funcione para todos os casos de teste em um tempo razoável.Veja abaixo uma versão muito mais rápida que executa todos os casos de teste em menos de um segundo.Experimente on-line ou verifique mais alguns casos de teste (menores) .
Explicação:
05AB1E , 29 bytes
Aqui está uma versão muito mais rápida, que funciona para todos os casos de teste em cerca de 0,5 segundos no TIO:
Porta da resposta JavaScript de @mellamokb , por isso, certifique-se de que o vota!
Experimente online ou verifique todos os casos de teste .
Explicação:
OBSERVAÇÃO: funciona para maiúsculas e minúsculas
0 0
nesse caso (diferente da resposta JavaScript da qual portou este método), porque oL
built-in criará uma lista[0,1]
.fonte