Genera todas las combinaciones de una lista de elementos dada, ordenada

13

Haga un código que tome una lista y un número como entrada, y genere todas las combinaciones posibles con la longitud del número. Por ejemplo, con la lista {0,1} y el número 2 :

00
01
10
11

Su programa no tiene que esperar caracteres dos veces o más a menudo en la lista, como {0,0,0,0,0,1,1,5,5}

Asegúrese de imprimir las combinaciones ordenadas, en el orden de la lista:

Con la lista {0,1} y el número 5 (generado por parte de mi código, que es demasiado largo para ganar):

00000
00001
00010
00011
00100
00101
00110
00111
01000
01001
01010
01011
01100
01101
01110
01111
10000
10001
10010
10011
10100
10101
10110
10111
11000
11001
11010
11011
11100
11101
11110
11111

Pero con la lista {1,0} y el número 2 :

11
10
01
00

Como puede ver, la lista inversa significa el orden inverso.

Echa un vistazo a la estructura, es como un árbol.

Este es el código de golf, por lo que gana el código más corto en bytes

LMD
fuente
3
Pensé que esto sería duplicado, pero no puedo encontrar uno
Luis Mendo
1
¿Cómo funciona la ordenación si la lista de entrada no está ordenada?
JAD
@Jarko Supongo que las tuplas de índices de la entrada se ordenan en la salida
Luis Mendo
1
@brad, la respuesta predeterminada es sí a menos que OP haya dicho algo más.
Stewie Griffin
3
No entiendo ... ¿qué hay de malo en usar mi propio nombre como nombre de usuario?
Stewie Griffin

Respuestas:

16

Jalea , 1 byte

TryItOnline

Átomo incorporado de potencia cartesiana, como un enlace diádico con argumento izquierdo los elementos y argumento derecho el recuento, o como un programa completo con primer argumento los elementos y segundo argumento el recuento.

Jonathan Allan
fuente
1
¡Un byte! Eso lo resolvió!
LMD
44
¿Sabes qué? ¡Enviaré una respuesta de byte CERO! En JAVA! ¿Cómo te gusta eso? :) (En serio, aunque. Buen golf.)
OldBunny2800
9

Haskell, 20 bytes

(mapM id.).replicate

Ejemplo de uso:

*Main> ( (mapM id.).replicate )  2 "01" 
["00","01","10","11"]
*Main> ( (mapM id.).replicate )  2 "10" 
["11","10","01","00"]

replicaterealiza ncopias del segundo parámetro y mapM idconstruye las combinaciones. Por cierto, mapM ides lo mismo que sequence, pero 1 byte menos.

nimi
fuente
6

Pyth, 2 bytes

^F

Un programa que toma datos en el formulario list,numbere imprime una lista de listas.

Banco de pruebas

Cómo funciona

^F   Program. Input: Q
^FQ  Implicit input fill
 F   Fold
^    repeated Cartesian power
  Q  over Q
     Implicitly print
TheBikingViking
fuente
esto parece resolverlo, pero ¿probablemente alguien más puede hacer esto con un byte?
LMD
sí, alguien más ganó (gelatina, un byte) pero buena solución, de todos modos
LMD
6

Perl 6 , 15 bytes

{[X] @^a xx$^b}

Explicación:

{[X] @^a xx$^b}

{             } # bare block lambda

     @^a        # declare first parameter as Positional
           $^b  # declare second parameter
         xx     # list repeat 「@a」, 「$b」 times

# at this point given 「 (0,1), 5 」
# ((0 1) (0 1) (0 1) (0 1) (0 1))

 [ ]            # list reduce
  X             #    using cross meta-operator

# results in a list of lists
# ((0 0 0 0 0)
#  (0 0 0 0 1)
#  (0 0 0 1 0)
#  (0 0 0 1 1)
#  (0 0 1 0 0)
#  (0 0 1 0 1)
#  ...
#  (1 1 1 1 1))
say {[X] $^a xx$^b}( (0,1), 2 ); # ((0 0) (0 1) (1 0) (1 1))
say {[X] $^a xx$^b}( (1,0), 2 ); # ((1 1) (1 0) (0 1) (0 0))
say {[X] $^a xx$^b}( (0,1,2), 2 );
# ((0 0) (0 1) (0 2) (1 0) (1 1) (1 2) (2 0) (2 1) (2 2))

put {[X] $^a xx$^b}( (0,1), 5 )».join;
# 00000 00001 00010 00011 00100 00101 00110 00111 01000 01001 01010 01011 01100 01101 01110 01111 10000 10001 10010 10011 10100 10101 10110 10111 11000 11001 11010 11011 11100 11101 11110 11111
Brad Gilbert b2gills
fuente
Si alguna vez se actualizan a una versión de Rakudo después del lanzamiento oficial de Perl 6 , podrás ejecutar esto en Ideone .
Brad Gilbert b2gills
5

JavaScript (Firefox 30+), 55 bytes

f=(a,n)=>n?[for(b of a)for(c of f(a,n-1))[b,...c]]:[[]]

Estoy 99% seguro de que la recursión es la mejor manera de hacerlo en JavaScript.

ETHproductions
fuente
4

Perl, 30 bytes

28 bytes de código + -nlbandera.

$"=",";say for glob"{@F}"x<>

Para ejecutarlo:

perl -alE '$"=",";say for glob"{@F}"x<>' <<< "1 0
2"

Creo que tomar la entrada como una lista de números es lógico para Perl. Sin embargo, si permitimos algo de fantasía y tomamos la entrada con los corchetes y la coma (como se muestra en la pregunta), podemos bajar a 20 bytes :

perl -nlE 'say for glob$_ x<>' <<< "{1,0}
2"

Explicaciones: glob el propósito inicial en Perl es enumerar e iterar a través de los nombres de archivo, pero cuando su argumento contiene llaves, genera combinaciones formadas por un elemento de cada grupo de llaves.
-aautosplit en espacios la entrada, y poner el resultado dentro de la @Fmatriz.
$"es el separador de lista: es el separador insertado entre los elementos de una lista dentro de una cadena. Lo configuramos en ,, entonces "{@F"}produce {.,.}(si @Fcontiene 0 y 1).
Entonces xes el operador de repetición de cadena (y <>obtiene una línea de entrada).
Y finalmente, say forrecorre la lista generada por globe imprime los elementos.

Dada
fuente
4

Mathematica, 6 bytes

Tuples

Aún peor que Jelly :(

Uso

Tuples[{0, 1}, 5]

{{0, 0, 0, 0, 0}, {0, 0, 0, 0, 1}, {0, 0, 0, 1, 0}, {0, 0, 0, 1, 1}, {0, 0, 1, 0, 0}, {0, 0, 1, 0, 1}, {0, 0, 1, 1, 0}, {0, 0, 1, 1, 1}, {0, 1, 0, 0, 0}, {0, 1, 0, 0, 1}, {0, 1, 0, 1, 0}, {0, 1, 0, 1, 1}, {0, 1, 1, 0, 0}, {0, 1, 1, 0, 1}, {0, 1, 1, 1, 0}, {0, 1, 1, 1, 1}, {1, 0, 0, 0, 0}, {1, 0, 0, 0, 1}, {1, 0, 0, 1, 0}, {1, 0, 0, 1, 1}, {1, 0, 1, 0, 0}, {1, 0, 1, 0, 1}, {1, 0, 1, 1, 0}, {1, 0, 1, 1, 1}, {1, 1, 0, 0, 0}, {1, 1, 0, 0, 1}, {1, 1, 0, 1, 0}, {1, 1, 0, 1, 1}, {1, 1, 1, 0, 0}, {1, 1, 1, 0, 1}, {1, 1, 1, 1, 0}, {1, 1, 1, 1, 1}}

JungHwan Min
fuente
3

Python, 57 bytes

from itertools import*
lambda o,n:list(product(*([o]*n)))

repl.it

Función sin nombre que toma una lista de objetos oy un recuento, ny devuelve una lista de las combinaciones.

Jonathan Allan
fuente
3

Pure Bash, 36

printf -vv %$2s
eval echo ${v// /$1}

Entrada por parámetros de línea de comandos: la lista es una lista separada por comas entre llaves, por ejemplo:

./elemcombo.sh "{0,1}" 2

Tenga en cuenta que la lista de entrada debe citarse para que el shell de llamada no la expanda demasiado pronto.

Ideone .

Trauma digital
fuente
Esto no parece funcionar.
Ipor Sircer
Solo repite la entrada n veces, no imprime todas las combinaciones posibles.
Ipor Sircer
@IporSircer Aclaré el formato de entrada requerido. ¿Eso funciona para ti ahora?
Trauma digital
bash a.sh "{0,1}" 2-> {0,1}{0,1}(versión 4.4.5 (1) -release)
Ipor Sircer
1
@IporSircer Parece que TIO probablemente está poniendo los argumentos en una llamada execve () o similar. Las comillas solo son necesarias cuando el script se llama desde otro shell para evitar que el shell que realiza la llamada expanda las llaves. En el caso de TIO, la lista no necesita comillas. tio.run/nexus/…
Digital Trauma
3

R , 53 45 bytes

function(x,n)rev(expand.grid(rep(list(x),n)))

Pruébalo en línea!

rev está ahí para cumplir con el orden de clasificación preciso solicitado (que realmente no parece esencial para el problema) y agrega 5 bytes.

ngm
fuente
Solo revpor 45 bytes :)
JayCe
Tenía una matriz en mente y olvidé que el resultado era en realidad una lista (marco de datos).
ngm
1

Raqueta 123 bytes

(let p((s "")(l(map number->string(sort l <))))
(if(= n(string-length s))(displayln s)(for((i l))(p(string-append s i)l))))

Sin golf:

(define(f l n)
  (let loop ((s "")
             (l (map number->string (sort l <))))
    (if (= n (string-length s))
        (displayln s)
        (for ((i l))
          (loop (string-append s i) l)))))

Pruebas:

(f '(0 1) 2)
(f '(0 1) 3)
(f '(0 1) 5)

Salida:

00
01
10
11

000
001
010
011
100
101
110
111

00000
00001
00010
00011
00100
00101
00110
00111
01000
01001
01010
01011
01100
01101
01110
01111
10000
10001
10010
10011
10100
10101
10110
10111
11000
11001
11010
11011
11100
11101
11110
11111
rnso
fuente
1

PHP, 109 bytes

for($o=$a=array_slice($argv,2);--$argv[1];$o=$c,$c=[])foreach($a as$n)foreach($o as$s)$c[]=$n.$s;print_r($o);

Toma la longitud como primer argumento y la lista como cualquier otro argumento.
Usar como:

php -r "for($o=$a=array_slice($argv,2);--$argv[1];$o=$c,$c=[])foreach($a as$n)foreach($o as$s)$c[]=$n.$s;print_r($o);" 5 0 1

Se ejecutará un error fatal "sin memoria" si se le solicita la longitud 0.

usuario59178
fuente
No tendrá que manejar la longitud 0.
LMD
1

05AB1E , 2 1 byte s

ã

-1 byte gracias a @Enigma .

Pruébalo en línea.

Entrada como number\nlist, salida como lista de listas.

Explicación:

     # Implicit input `a`, `b`
ã    # Take the Cartesian product of list `b` repeated `a` times
Kevin Cruijssen
fuente
1
No necesitas el Iaquí.
Emigna
@Emigna Ah, por supuesto. Tuve el Iporque inicialmente estaba tratando de descubrir cómo tener múltiples entradas y tuve el número y la lista invertidos. Bastante estúpido para mantener el Iallí ... ¡Gracias!
Kevin Cruijssen