Liste todas las combinaciones con reemplazo (o combinaciones con repetición) de tamaño k de un conjunto de n elementos.
Una combinación con reemplazo es un conjunto múltiple desordenado en el que cada elemento también está en el conjunto de n elementos. Tenga en cuenta que:
- No está ordenado Por lo tanto, un conjunto previamente impreso con un orden diferente no debe imprimirse nuevamente.
- Es un conjunto múltiple. El mismo elemento puede (pero no es obligatorio) aparecer más de una vez. Esta es la única diferencia entre una combinación con reemplazo y una combinación normal.
- El conjunto debe tener exactamente k elementos.
Alternativamente, también es un subconjunto de tamaño k del conjunto múltiple que contiene cada uno de los n elementos k veces.
La entrada debe ser o bien n y k , donde los elementos son los primeros n positivos o no negativos números enteros, o los n elementos y k , en las que pueden asumir los n elementos son todos diferentes unos de otros.
El resultado debe ser una lista de todas las combinaciones con reemplazo con el tamaño k del conjunto dado. Puede imprimirlos y los elementos en cada uno de ellos en cualquier orden.
No puede usar combinaciones integradas que generen reemplazos. Pero puede usar builtins para generar combinaciones normales, permutaciones, tuplas, etc.
Este es el código de golf, el código más corto gana.
Ejemplo
Input: 4 2
Output: [0 0] [0 1] [0 2] [0 3] [1 1] [1 2] [1 3] [2 2] [2 3] [3 3]
fuente

{}∪Sort/@Range@#~Tuples~#2&MATL , 11 bytes
(Hay una solución de 9 bytes basada en el poder cartesiano, pero Peter Taylor ya lo hizo . Probemos algo diferente).
Las combinaciones con reemplazo se pueden reducir a combinaciones sin reemplazo de la siguiente manera. Queremos
n Cr k, por ejemplon=3, conk=2:Podemos calcular
n+k-1 C k:y luego restar
0 1 ... k-1de cada fila:Explicación:
El código funciona en la versión 13.1.0 del lenguaje / compilador, que es anterior al desafío.
¡Puedes probarlo en línea! Tenga en cuenta que el compilador en línea se ha actualizado a la versión 14.0.0, por lo
Xnque debe cambiarse aXN.fuente
JavaScript (Firefox 30-57), 71 bytes
Puedo usar
keys()por una vez.fuente
Ruby,
5655 bytesDos soluciones, sorprendentemente ambas de la misma longitud:
Oye, ¿ qué dice que podríamos utilizar órdenes internas de permutación ...
Esto simplemente genera todas las permutaciones repetidas (la segunda genera productos cartesianos repetidos) y elimina las que no están ordenadas.
¡Gracias a Martin por guardar un byte con
0...n->1..n!fuente
Pyth, 7 bytes
Utiliza el mismo algoritmo que la respuesta de Peter.
fuente
Python, 63 bytes
Un método recursivo. Para hacer un conjunto múltiple de
kelementos,1an, elegimos:n, y queda por hacer un conjunto múltiple dek-1elementos desde1hastann, y queda por hacer un conjunto múltiple dekelementos desde1hastan-1Terminamos cuando
konalcanza0, y sikllegó0, damos un caso base de la lista vacía. Si no es así, tenemos el número incorrecto de elementos, por lo que damos la lista vacía.fuente
Pitón 3,
8180Solución recursiva:
La función
t(n, k, b)devuelve la lista de todos losksubconjuntos múltiples de elementos del rango deban. Esta lista está vacía sik <= 0. De lo contrario, desglosamos el problema en función del elemento más pequeño del subconjunto múltiple, que denotamos pori.Para cada uno
ien el rango deban, generamos todos losksubconjuntos múltiples con el elemento más pequeñoial comenzar[i]y luego(k-1)agregar cada subconjunto múltiple del rango deian, que obtenemos llamando de forma recursivat(n, k-1, i).fuente
Dyalog APL , 22 bytes
Requiere
⎕IO←0, que es el predeterminado en muchos sistemas APL. Toma k como argumento izquierdo, n como argumento derecho.⍳⍺*⍵0 1 2 ... kⁿ⍺⊥⍣¯1convertir a base k⍉transponer↓hacer matriz en una lista de listas{⍵[⍋⍵]}¨ordenar cada ...∪la únicafuente
J, 18 bytes
Enfoque similar utilizado en la solución de @ Adám .
Otro enfoque utilizando el producto cartesiano
{para 24 bytes. Tomakel LHS ynel RHS.Uso
Explicación
fuente
Clojure, 94 bytes
Tenga en cuenta el orden de los parámetros modificados: 1st is
ky 2nd isn. Esto ahorró 1 byte en(f(dec k)n).fuente
Mathematica, 36 bytes
Por favor, dime que hay una bonificación de 1/6 por no usar [] s ... ¿O tal vez por los muchos usos de ##?
fuente