Liste todas as combinações com substituição (ou combinações com repetição) do tamanho k de um conjunto de n elementos.
Uma combinação com substituição é um conjunto múltiplo não ordenado de que todos os elementos também estão no conjunto de n elementos. Observe que:
- Não é ordenado. Portanto, um conjunto impresso anteriormente com um pedido diferente não deve ser impresso novamente.
- É um multiset. O mesmo elemento pode (mas não é necessário) aparecer mais de uma vez. Essa é a única diferença entre uma combinação com substituição e uma combinação normal.
- O conjunto deve ter exatamente k elementos.
Como alternativa, também é um subconjunto tamanho- k do multiset que contém cada um dos n elementos k vezes.
A entrada deve ser n e k , onde os elementos são os primeiros n números inteiros positivos ou não negativos, ou os n elementos e k , onde você pode assumir que os n elementos são todos diferentes um do outro.
A saída deve ser uma lista de todas as combinações com substituição com tamanho k do conjunto fornecido. Você pode imprimi-los e os elementos em cada um deles em qualquer ordem.
Você não pode usar os componentes internos gerando combinações com substituição. Mas você pode usar builtins para gerar combinações normais, permutações, tuplas, etc.
Este é o código-golfe, o código mais curto vence.
Exemplo
Input: 4 2
Output: [0 0] [0 1] [0 2] [0 3] [1 1] [1 2] [1 3] [2 2] [2 3] [3 3]
fonte
{}∪Sort/@Range@#~Tuples~#2&
MATL , 11 bytes
(Existe uma solução de 9 bytes baseada no poder cartesiano, mas Peter Taylor já fez isso . Vamos tentar algo diferente).
Combinações com substituição podem ser reduzidas a combinações sem substituição, como a seguir. Queremos
n Cr k
, por exemplon=3
, comk=2
:Podemos calcular
n+k-1 C k
:e subtraia
0 1 ... k-1
de cada linha:Explicação:
O código funciona na versão 13.1.0 do idioma / compilador, anterior ao desafio.
Você pode experimentá-lo online! Observe que o compilador online foi atualizado para a versão 14.0.0, portanto,
Xn
precisa ser alterado paraXN
.fonte
JavaScript (Firefox 30-57), 71 bytes
Eu uso
keys()
pela primeira vez.fonte
Ruby,
5655 bytesDuas soluções, surpreendentemente ambas do mesmo comprimento:
Ei, você se dizer que poderíamos usar builtins permutação ...
Isso simplesmente gera todas as permutações repetidas (a segunda gera produtos cartesianos repetidos) e remove aquelas que não estão na ordem de classificação.
Agradecemos a Martin por salvar um byte com
0...n
->1..n
!fonte
Pitão, 7 bytes
Usa o mesmo algoritmo que a resposta de Peter.
fonte
Python, 63 bytes
Um método recursivo. Para criar um conjunto múltiplo de
k
elementos,1
paran
, escolhemos:n
, e resta criar um multiset dek-1
elementos de1
paran
n
, e resta criar um conjunto múltiplo dek
elementos de1
paran-1
Terminamos quando um deles chega
k
ou , e se chegou , fornecemos um caso base da lista vazia. Caso contrário, temos o número errado de elementos e, portanto, forneça a lista vazia.n
0
k
0
fonte
Python 3,
8180Solução recursiva:
A função
t(n, k, b)
retorna a lista de todosk
os subconjuntos de todos os elementos do intervalo deb
an
. Esta lista está vazia sek <= 0
. Caso contrário, decompomos o problema com base no menor elemento do multi-subconjunto, que denotamos pori
.Para cada um
i
no intervalo deb
an
, geramos todos osk
-multi-subconjuntos com o menor elementoi
iniciando com[i]
e depois anexando cada(k-1)
-multi-subconjunto do intervalo dei
an
, que obtemos chamando recursivamentet(n, k-1, i)
.fonte
Dyalog APL , 22 bytes
Requer
⎕IO←0
, que é o padrão em muitos sistemas APL. Leva k como argumento à esquerda, n como argumento à direita.⍳⍺*⍵
0 1 2 ... kⁿ⍺⊥⍣¯1
converte na base k⍉
transposição↓
transforma a matriz em lista de listas,{⍵[⍋⍵]}¨
classifique cada ...∪
a únicafonte
J, 18 bytes
Abordagem semelhante usada na solução da @ Adám .
Outra abordagem usando o produto cartesiano
{
por 24 bytes. Assumek
o LHS en
o RHS.Uso
Explicação
fonte
Clojure, 94 bytes
Observe a ordem dos parâmetros alterados: 1º
k
e 2ºn
. Isso economizou 1 byte em(f(dec k)n)
.fonte
Mathematica, 36 bytes
Por favor, diga-me que há um bônus de 1/6 por não usar [...] ... Ou talvez pelos muitos usos de ##?
fonte