Escreva um programa que aceite uma entrada como:
n,k
que então calcula:
e depois imprime o resultado.
Um exemplo numérico:
Entrada:
5,2
Cálculo interno:
Saída impressa:
10
Gostaria de ver uma resposta que supera minha solução python de 65 caracteres, mas todos os idiomas são obviamente bem-vindos.
Aqui está a minha solução:
n,k=input();f=lambda x:+(x<2)or x*f(x-1);print f(n)/(f(k)*f(n-k))
Editar:
Admito que esta pergunta é do quebra-cabeça de combinação matemática do site codegolf . Sei que minha resposta pode parecer que não há muito progresso nisso, mas os líderes desse quebra-cabeça o resolveram em quase a metade dos caracteres.
As contagens mais baixas atuais de caracteres por idioma são:
Perl: 35
Ruby: 36
Python: 39
PHP: 62
code-golf
combinatorics
Backus
fonte
fonte
Respostas:
APL, 3 bytes
Ou para aqueles cujo navegador não renderiza o acima, em uma renderização ASCII:
fonte
n,k
entrada, você teria que fazer!/⌽⎕
.R (11 caracteres)
fonte
C 96
Com E / S (que leva cerca de 34 caracteres). Foram adicionadas algumas novas linhas para torná-las legíveis.
Agora, se você me der licença, eu tenho um ASCII e escolha k foguete para pegar.
fonte
GolfScript, 17 caracteres
Esta solução lida com casos como k = 0 ou k = 1 corretamente.
A parte fatorial é baseada em uma resposta anterior .
fonte
GolfScript 21
Não particularmente curto, o GolfScript não possui uma função fatorial real, no entanto, essa deve ser a manipulação de dados mais maliciosa que eu já fiz, isso exige um rastreamento de pilha:
"5,2" Dados na pilha a partir da entrada.
~
O comando Eval, observe que, é um operador que transforma um número em uma matriz.[0 1 2 3 4] 2
~
Binário não.[0 1 2 3 4] -3
)
Incremento.[0 1 2 3 4] -2
>
Tome o final da matriz, -2 como parâmetro para obter os últimos 2 elementos.[3 4]
.
Elemento duplicado.[3 4] [3 4]
,
Comprimento da matriz.[3 4] 2
,
Gire o número para o array.[3 4] [0 1]
]
Crie uma matriz.[[3 4] [0 1]]
{{)}%{*}*}
Bloco de código.[[3 4] [0 1]] {{)}% {*} *}
%
Execute o bloco uma vez para cada elemento da matriz. A parte a seguir demonstra apenas o primeiro loop.[3 4]
{)}%
Incremente cada elemento da matriz.[4 5]
{*}
Bloco contendo um comando de multiplicação.[4 5] {*}
*
"Dobre" a matriz usando o comando block, ou seja, faça o produto de todos os elementos.20
Depois que o loop grande termina, ele retorna uma matriz com os resultados.
[20 2]
~
Desconstrua a matriz.20 2
/
Divisão.10
fonte
Ruby 1.9,
5246 (42) caracteresSe stderr for ignorado:
Ruby 1.8, 43 caracteres, sem saída adicional para o stderr:
Editar% s:
fonte
Python (56)
Código não-bloqueado e alguma explicação de um atalho para calcular o coeficiente binomial. (Observação: há algumas dicas que eu ainda não descobri para chegar à versão de 39 caracteres; não acho que essa abordagem o levará até lá.)
fonte
*
para analisar entradas do formulário4545 78
?*
esse o problema.4545 78
não é uma expressão válida do Python, entãoinput()
aumentará aSyntaxError
. Esse truque depende inteiramente do problema solicitadox,y
. Se você tivesse uma função que lessex y
e retornasse uma tupla, poderia usá-la*
perfeitamente.RPL (4)
(usando a função incorporada)
fonte
Windows PowerShell, 57
fonte
J,
333635 caracteres são de entrada, análise e saída. O outro caractere
!
,, é n, escolha k.No momento, não tenho o Windows para testar isso no momento, mas acredito que deve funcionar lá.
fonte
Q, 32 caracteres
fonte
Perl 6 (55)
fonte
RPL (22)
(não usando a função COMB embutida)
fonte
Q (
5045)Você pode raspar alguns caracteres acima, removendo colchetes redundantes e usando 1 * / em vez de prd.
fonte
Mathematica 12
Função simples e integrada.
fonte
Perl 6 ,
2516 bytes-9 bytes graças a nwellnhof
Experimente online!
Função anônima que recebe dois números e retorna um int. Isso usa o built-in
combinations
e converte a lista retornada em um int.fonte
combinations
poderia ter um número em vez de uma listaPHP (71
79)fonte
Python (54)
Essencialmente o mesmo que o Python acima, mas eu corto quatro bytes soltando o
da definição da função. No entanto, isso resulta na função retornando True em vez de 1 se k = 0, mas isso pode ser corrigido multiplicando-se 1 antes da impressão, pois 1 * True = 1, adicionando assim dois bytes.
fonte
J, 11 caracteres
Recebe entrada do teclado.
fonte
Haskell (80)
Mas, se a entrada no formato
x y
é permitida, e não no formatox,y
, são 74 caracteres:fonte
Scala 54
fonte
Python (52)
Aprimorado dos outros dois usando
print+
para converter o resultado def
fromboolean
paraint
casek==0
.Ainda não tenho idéia de como reduzi-lo para 39, gostaria de saber se eles estão usando lambda.
fonte
(O OP especificou vagamente o método / formato de entrada e saída, portanto o seguinte parece aceitável.)
Caderno Sábio (
39 4140)Na célula atual,
onde a entrada no formulário
n,k
é inserida e avaliada na célula anterior. Isso simula a "entrada da linha de comando" atribuindo-a a_
(semelhante aos argumentos da linha de comando).Caderno Sábio (
42 4443)Como alternativa, usando "entrada na fonte" (com apenas os
x=
caracteres newline e adicionados à pontuação), por exemplo,Ambas as abordagens são obviamente derivadas de respostas anteriores de outras pessoas.
fonte
Tcl , 80 bytes
Experimente online!
fonte
Javascript, 27 bytes
Primeiro, minhas próprias soluções de 35 bytes:
Ou alternativamente,
O primeiro trabalhando recursivamente, com a
(n,k) = (n-1,k) + (n-1,k-1)
regra simples . O segundo usando isso(n,k) = (n-1,k-1) * n/k
.EDITAR
Acabei de perceber a solução de Arnould em uma duplicata:
Que é um gritante 8 bytes a menos (27 bytes)
fonte
TI-BASIC, 16 caracteres (8 bytes)
Entrada é uma lista de comprimento 2 pol
Ans
.Saída é o resultado da fórmula definida aqui .
Se a solução acima não for suficiente, a seguinte solução de 35 caracteres (24 bytes) também funcionará:
Nota: TI-BASIC é um idioma tokenizado. Contagem de caracteres não é igual à contagem de bytes.
fonte