P k (n) significa a quantidade de partições n
exatamente em k
partes. Dado n
e k
, calcule P k (n).
Dica: P k (n) = P k (n-k) + P k-1 (n-1), com valores iniciais p 0 (0) = 1 ep k (n) = 0 se n ≤ 0 ou k ≤ 0. [Wiki]
Exemplos
n k Ans
1 1 1
2 2 1
4 2 2
6 2 3
10 3 8
Regras
- Aplicam-se as regras gerais de código-golfe .
code-golf
combinatorics
integer-partitions
Matthew Roh
fonte
fonte
8
vez de7
.Respostas:
Pitão ,
976 bytes-1 byte graças a Erik, o Outgolfer !
Experimente online!
As entradas para o programa são revertidas (ie
k, n
).fonte
Rápido ,
7673 bytesExperimente online!
Explicação
Como o código funciona estruturalmente?
Antes de tudo, definimos nossa função
P
, com dois parâmetros inteirosn
ek
, e dar-lhe um tipo de retornoInt
, com este pedaço de código:func P(_ n:Int,_ k:Int)->Int{...}
. O truque legal aqui é que dizemos ao compilador para ignorar os nomes dos parâmetros,_
seguido por um espaço, o que nos salva dois bytes quando chamamos a função.return
é obviamente usado para retornar o resultado do nosso ternário aninhado descrito abaixo.Outro truque que usei foi o de
n*k>0
poupar alguns bytesn>0&&k>0
. Se a condição for verdadeira (ambos os números inteiros ainda são maiores que0
), então recursivamente chamamos nossa função comn
decrementada dek
como novan
ek
permanece a mesma, e adicionamos o resultado deP()
comn
ek
decrementada por 1. Se a condição não for verdadeira , retornamos um1
ou0
dependendo sen
é igual ak
.Como o algoritmo recursivo funciona?
Sabemos que o primeiro elemento da sequência é p 0 (0) e, portanto, verificamos se os dois números inteiros são positivos (
n*k>0
). Se não forem maiores que 0, verificamos se são iguais (n==l ?1:0
), sendo dois casos:Existe exatamente 1 partição possível e, portanto, retornamos 1, se os números inteiros forem iguais.
Não há partições se uma delas já for 0 e a outra não.
No entanto, se ambos forem positivos, chamamos recursivamente
P
duas vezes, adicionando os resultados deP(n-k,k)
eP(n-1,k-1)
. E rodamos novamente atén
atingir 0.* Nota: Os espaços não podem ser removidos.
fonte
Gelatina , 6 bytes
Experimente online!
fonte
Python 2 ,
61555150 bytes-10 bytes graças a Erik, o Outgolfer. -1 byte graças ao Sr. Xcoder.
Eu direi que copiei a dica do OP e a traduzi para Python. : P
Experimente online!
fonte
(n>0and k>0)
->n>0<k
+(n==k)
vez de[0,1][n==k]
.or +
.n>0<k and
porn*k>0and
Mathematica, 33 bytes
aqui está a tabela nxk
fonte
Length
->Len`1
eIntegerPartitions
->Int`7
JavaScript (ES6),
424039 bytesEu acho que isso funciona.
Tente
fonte
MATL , 14 bytes
Experimente online!
Explicação
Considere entradas
6
,2
.fonte
Haskell, 41 bytes
Experimente online!
fonte
Haskell , 41 bytes
Experimente online!
Uma recorrência alternativa.
fonte
Pari / GP , 35 bytes
O Pari / GP possui um built-in para iterar sobre partições inteiras.
Experimente online!
fonte
Gelatina , 13 bytes
Eu
tenho um sentimentosabe esta abordagem básica não vai ser o golfiest!Experimente online!
fonte
05AB1E , 9 bytes
Experimente online!
fonte
CJam , 18 bytes
Experimente online!
Espera entradas ao contrário, ou seja, em
k n
vez den k
.fonte
Scala , 73 bytes
Bem, este é um uso fácil e não resolvido da dica do OP.
k
en
são os parâmetros da minha função recursivaf
. Vejo link do TIO para o contexto.Como isso é recursivo, devo incluir a função def na contagem de bytes?
Experimente online!
fonte
C (gcc) , 41 bytes
Experimente online!
fonte
R (+ pryr), 49 bytes
Que avalia a função recursiva
(k < 1 | n < 1)
verifica se algum dos estados iniciais é atendido.!n + k
avalia como TRUE (1) se ambosn
ek
são 0 e FALSE (0) caso contrário.f(n - k, k) + f(n - 1, k - 1)
lida com a recursão.fonte