Générer toutes les combinaisons d'une liste d'éléments donnée, triée

13

Créez un code qui prend une liste et un nombre en entrée et génère toutes les combinaisons possibles avec la longueur du numéro. Par exemple, avec la liste {0,1} et le nombre 2 :

00
01
10
11

Votre programme ne doit pas s'attendre à des caractères deux fois ou plus souvent dans la liste, tels que {0,0,0,0,0,1,1,5,5}

Assurez-vous d'imprimer les combinaisons triées, dans l'ordre de la liste:

Avec la liste {0,1} et le chiffre 5 (généré par une partie de mon code, ce qui est beaucoup trop long pour gagner):

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

Mais avec la liste {1,0} et le numéro 2 :

11
10
01
00

Comme vous pouvez le voir, la liste inversée signifie l'ordre inversé.

Jetez un oeil à la structure, c'est comme un arbre.

C'est le code-golf, donc le code le plus court en octets gagne!

LMD
la source
3
Je pensais que ce serait en double, mais je n'en trouve pas
Luis Mendo
1
Comment fonctionne le tri si la liste d'entrée n'est pas triée?
JAD
@Jarko Je suppose que les tuples d' indices de l'entrée sont triés dans la sortie
Luis Mendo
1
@brad, la réponse par défaut est oui, sauf si OP a dit autre chose.
Stewie Griffin
3
Je ne comprends pas ... qu'est-ce qui ne va pas avec mon propre nom comme nom d'utilisateur?
Stewie Griffin

Réponses:

16

Gelée , 1 octet

TryItOnline

Atome intégré de puissance cartésienne, en tant que lien dyadique avec l'argument gauche les éléments et l'argument droit le décompte, ou en tant que programme complet avec le premier argument les éléments et le deuxième argument le décompte.

Jonathan Allan
la source
1
Un octet! Cela l'a résolu!
LMD
4
Vous savez quoi, je vais soumettre une réponse ZERO byte! À JAVA! Comment aimez-vous ça, hein? :) (Sérieusement, cependant. Bon golf.)
OldBunny2800
9

Haskell, 20 octets

(mapM id.).replicate

Exemple d'utilisation:

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

replicatefait des ncopies du 2e paramètre et mapM idconstruit les combinaisons. Btw, mapM idest le même que sequence, mais 1 octet de moins.

nimi
la source
6

Pyth, 2 octets

^F

Un programme qui prend la saisie dans le formulaire list,numberet imprime une liste de listes.

Suite de tests

Comment ça fonctionne

^F   Program. Input: Q
^FQ  Implicit input fill
 F   Fold
^    repeated Cartesian power
  Q  over Q
     Implicitly print
TheBikingViking
la source
cela semble le résoudre, mais probablement quelqu'un d'autre est capable de le faire avec un octet?
LMD
oui, quelqu'un d'autre a gagné (gelée, un octet) mais belle solution quand même
LMD
6

Perl 6 , 15 octets

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

Explication:

{[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
la source
S'ils mettent à jour une version de Rakudo après la sortie officielle de Perl 6, vous pourrez l'exécuter sur Ideone .
Brad Gilbert b2gills
5

JavaScript (Firefox 30+), 55 octets

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

Je suis certain à 99% que la récursivité est la meilleure façon de procéder à ce sujet en JavaScript.

ETHproductions
la source
4

Perl, 30 octets

28 octets de code + -nlindicateur.

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

Pour l'exécuter:

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

Je pense que prendre l'entrée comme une liste de nombres est logique pour Perl. Cependant, si nous permettons un peu de fantaisie, et prenons l'entrée avec les crochets et la virgule (comme indiqué dans la question), nous pouvons descendre à 20 octets :

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

Explications: glob le but initial en Perl est lister et parcourir les noms de fichiers, mais lorsque son argument contient des crochets, il génère des combinaisons formées d'un élément de chaque groupe de crochets.
-aautosplit sur les espaces de l'entrée et placez le résultat dans le @Ftableau.
$"est le séparateur de liste: c'est le séparateur inséré entre les éléments d'une liste à l'intérieur d'une chaîne. Nous le définissons sur ,, donc "{@F"}produit {.,.}(si @Fcontient 0 et 1).
Ensuite , xest l'opérateur de répétition de chaîne (et <>obtient une ligne d'entrée).
Et enfin, say forparcourt la liste générée par globet imprime les éléments.

Dada
la source
4

Mathematica, 6 octets

Tuples

Encore pire que Jelly :(

Usage

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
la source
3

Python, 57 octets

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

repl.it

Fonction sans nom prenant une liste d'objets oet un nombre net renvoyant une liste des combinaisons.

Jonathan Allan
la source
3

Pure Bash, 36

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

Entrée par les paramètres de ligne de commande - La liste est une liste séparée par des virgules entre accolades, par exemple:

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

Notez que la liste d'entrée doit être citée afin que le shell appelant ne la développe pas trop tôt.

Ideone .

Traumatisme numérique
la source
Cela ne semble pas fonctionner.
Ipor Sircer
Il ne répète que n entrées, n'imprime pas toutes les combinaisons possibles.
Ipor Sircer
@IporSircer J'ai clarifié le format d'entrée requis. Est-ce que ça marche pour vous maintenant?
Digital Trauma
bash a.sh "{0,1}" 2-> {0,1}{0,1}(version 4.4.5 (1) -release)
Ipor Sircer
1
@IporSircer Il semble que TIO place probablement les arguments dans un appel execve () ou similaire. Les guillemets ne sont nécessaires que lorsque le script est appelé à partir d'un autre shell afin d'empêcher le shell appelant de développer les accolades. Dans le cas de TIO, la liste n'a pas besoin de devis. tio.run/nexus/…
Digital Trauma
3

R , 53 45 octets

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

Essayez-le en ligne!

rev est là pour se conformer à l'ordre de tri précis demandé (ce qui ne semble pas vraiment essentiel au problème) et ajoute 5 octets.

ngm
la source
Juste revpour 45 octets :)
JayCe
J'avais une matrice en tête et j'ai oublié que le résultat était en fait une liste (bloc de données).
ngm
1

Raquette 123 octets

(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))))

Non 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)))))

Essai:

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

Production:

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
la source
1

PHP, 109 octets

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);

Prend la longueur comme premier argument et la liste comme tout autre argument.
Utilisez comme:

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

S'exécutera dans une erreur fatale "mémoire insuffisante" si la longueur 0 est demandée.

user59178
la source
Vous n'aurez pas à gérer la longueur 0.
LMD
1

05AB1E , 2 1 octet s

ã

-1 octet grâce à @Enigma .

Essayez-le en ligne.

Entrée en tant que number\nlist , sortir en tant que liste de listes.

Explication:

     # Implicit input `a`, `b`
ã    # Take the Cartesian product of list `b` repeated `a` times
Kevin Cruijssen
la source
1
Vous n'en avez pas besoin Iici.
Emigna
@Emigna Ah bien sûr. J'ai eu le Iparce que j'essayais initialement de comprendre comment avoir plusieurs entrées et que le nombre et la liste étaient inversés. Assez stupide pour garder le Ilà .. Merci!
Kevin Cruijssen