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-1
de 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
Xn
que 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
k
elementos,1
an
, elegimos:n
, y queda por hacer un conjunto múltiple dek-1
elementos desde1
hastan
n
, y queda por hacer un conjunto múltiple dek
elementos desde1
hastan-1
Terminamos cuando
k
on
alcanza0
, y sik
llegó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 losk
subconjuntos múltiples de elementos del rango deb
an
. 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
i
en el rango deb
an
, generamos todos losk
subconjuntos múltiples con el elemento más pequeñoi
al comenzar[i]
y luego(k-1)
agregar cada subconjunto múltiple del rango dei
an
, 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ⁿ⍺⊥⍣¯1
convertir 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. Tomak
el LHS yn
el RHS.Uso
Explicación
fuente
Clojure, 94 bytes
Tenga en cuenta el orden de los parámetros modificados: 1st is
k
y 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