Produit cartésien d'une liste avec elle-même n fois

10

Lorsqu'on lui donne une liste de valeurs et un entier positif n, votre code doit sortir le produit cartésien de la liste avec lui-même les ntemps.

Par exemple, dans le pseudocode, votre fonction pourrait être similaire à:

for x1 in list:
    for x2 in list:
        for x3 in list:
            ...
            for xn in list:
                print x1, x2, x3, ... , xn

Exemple:

repeated_cart([1,2,3], 3)

1 1 1  
1 1 2  
1 1 3  
1 2 1  
1 2 2  
1 2 3  
1 3 1  
1 3 2  
1 3 3  
2 1 1  
2 1 2  
2 1 3  
2 2 1  
2 2 2  
2 2 3  
2 3 1  
2 3 2  
2 3 3  
3 1 1  
3 1 2  
3 1 3  
3 2 1  
3 2 2  
3 2 3  
3 3 1  
3 3 2  
3 3 3

Les fonctions intégrées (ou les fonctions des bibliothèques importées) qui calculent le produit cartésien (ou la puissance) ne sont pas autorisées car le code résultant est quelque peu ennuyeux.

Les entrées et les sorties doivent être délimitées mais peuvent être prises par toute méthode raisonnable.

l'ordre dans lequel la sortie est donnée n'a pas d'importance mais les doublons ne sont pas autorisés.

C'est la première fois que je pose une question, donc si j'ai fait quelque chose d'horriblement mal, dites-le moi.

JoshM
la source
5
Bienvenue chez PPCG! Rien d'horrible, mais prenez le temps de regarder ce méta-message et ses réponses. Choses à éviter lors de la rédaction de défis
JayCe
4
et pour suivre le point de @JayCe, vous pouvez (devriez) poster dans The Sandbox pour obtenir des commentaires avant de poster une question :-)
Giuseppe
@Giuseppe Ok, je vais le faire à partir de maintenant, merci :)
JoshM
1
Dupe
Peter Taylor
1
Les sets @Jakob devraient bien se
passer

Réponses:

6

Lisp commun , 146 octets

(defun f(l n)(if(< n 2)(loop for x in l collect(list x))(loop for a in l nconc(loop for b in(f l(1- n))collect(cons a b)))))(princ(f(read)(read)))

Essayez-le en ligne!

non golfé

(defun nloops (lst n)
  (if (< n 1)
      '(())
      (if (< n 2)
          (loop for x in lst collect (list x))
          (loop for a in lst
                nconc (loop for b in (nloops lst (1- n))
                            collect (cons a b))))))
JoshM
la source
2
en général, nous vous suggérons d'attendre d'autres soumissions avant d'en publier une :-)
Giuseppe
1
@Giuseppe Ok, merci pour les conseils :)
JoshM
1
vous n'avez pas besoin d'avoir l'instruction print dans la soumission, car une fonction est autorisée
ASCII uniquement
1
donc: 96
ASCII uniquement
1
90
ASCII uniquement
6

R , 41 octets

function(l,n)unique(t(combn(rep(l,n),n)))

Essayez-le en ligne!

combnn'est certainement pas un produit cartésien intégré, car il calcule toutes les ncombinaisons de son entrée.

R , 40 octets

function(l,n)expand.grid(rep(list(l),n))

Essayez-le en ligne!

expand.grid est probablement un produit cartésien intégré.

Giuseppe
la source
Il semble que l'ordre des permutations dans votre soumission principale soit erroné.
Kirill L.
@KirillL. y a-t-il une raison particulière pour laquelle la commande est importante? J'ai interprété les spécifications de sortie comme étant suffisamment flexibles pour les autoriser dans n'importe quel ordre.
Giuseppe
il y a le commentaire de OP "assurez-vous que la sortie est dans le bon ordre", je suppose que "droite" signifie la même chose que dans l'exemple.
Kirill L.
@KirillL. Ah. Je n'ai pas vu ça; ce n'est pas dans le corps de la question donc je ne savais pas qu'elle existait! Je vais demander qu'il soit mis là pour clarification.
Giuseppe
4

Perl 6 , 16 octets

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

Essayez-le

Expnded:

{  # bare block lambda with placeholder parameters $a and $b

  [X,]         #reduce using Cross meta op combined with comma op

    $^a xx $^b # list repeat $a, by $b times
}
Brad Gilbert b2gills
la source
3

K (ngn / k) , 10 octets

{x@+!y##x}

Essayez-le en ligne!

{ }est une fonction avec des arguments xety

#x la longueur de x

y##xla longueur de xrépétition yfois

!y##x tous les tuples de longueur y supérieurs à 0,1, ..., longueur (x) -1 comme matrice transposée

+ transposer

x@éléments de xces indices

ngn
la source
3

APL (Dyalog Classic) , 18 12 octets

{⍺[↑,⍳⍵⍴≢⍺]}

Essayez-le en ligne!

-6 octets grâce à @ngn!

Zacharý
la source
vous pouvez utiliser avec un argument vectoriel pour générer des indices, puis ⍺[ ]pour obtenir les valeurs correspondantes
ngn
J'en ai un RANK ERRORquand j'ai essayé de faire ça.
Zacharý
le seul hic est avec ⍵ = 1, dans ce cas ⍳ renvoie un vecteur simple, pas un vecteur de vecteurs de longueur 1 imbriqués comme on pourrait s'y attendre; c'est l'un de ces bugs qui ne sont jamais corrigés, pour des raisons de
rétrocompatibilité
3

Python 2 , 69 58 octets

f=lambda a,n:n and[v+[i]for v in f(a,n-1)for i in a]or[[]]

Essayez-le en ligne!

Prend une liste aet un entier n; renvoie une liste de listes.

Chas Brown
la source
3

Rubis , 53 octets

f=->l,n{n<2?l:l.flat_map{|i|f[l,n-1].map{|j|[i,*j]}}}

Essayez-le en ligne!

Approche récursive, pas si courte, mais garantie d'être exempte de toute intégration.

Il est tentant d'utiliser des méthodes de permutation, mais cela ne compte probablement pas, et les documents n'indiquent en fait aucune garantie de l'exactitude de l'ordre, bien que cela semble fonctionner dans la pratique:

Rubis , 35 octets

->l,n{[*l.repeated_permutation(n)]}

Essayez-le en ligne!

Kirill L.
la source
2

Raquette, 92 octets

(define(f l n)(if(> n 0)(apply append(map(λ(r)(map(λ(e)(cons e r))l))(f l(- n 1))))'(())))

Essayez-le en ligne

Non golfé

(define (f l n)
    (if (> n 0)
        (apply append
            (map
                (λ (r)
                    (map (λ (e) (cons e r)) l)
                )
                (f l (- n 1))
            )
        )
        '(())
    )
)
Jakob
la source
2

Gelée , 11 9 7 octets

³;þẎƊ’¡

Essayez-le en ligne!

Explication

³;þẎƊ’¡
³;þẎ    **Implements** the cartesian product of a value with the input
    Ɗ   Groups those together
     ’¡ Repeat (n-1) times
Zacharý
la source
Regardez le commentaire d'OP: p
Zacharý
Mon commentaire sur lequel je l'ai soulevé est: "Je suppose également que les buildins pour l'ensemble du défi sont également interdits", alors j'ai simplement supposé que c'était correct.
Zacharý
Eh bien, attendons OP alors
Zacharý
@ Zacharý désolé, la fonction de puissance cartésienne n'est pas autorisée
JoshM
3
Je ne sais pas, deux boucles imbriquées comme celle-ci sont fondamentalement la définition d'un produit cartésien. Je ne dis pas que vous devriez le changer cependant, je pense simplement que l'interdiction de l'intégration dans ce défi n'est pas claire.
dylnan
2

Pure Bash (pas d'utilitaires externes), 57

printf -vn %0$1d
a=${n//0/{$2\}}
eval echo ${a//\}{/\},{}

L'entrée est donnée en tant que paramètres de ligne de commande; 1er est n, 2ème est une liste séparée par des virgules.

printf -vn %0$1d         ;# Create a string of n "0"s in the variable v
a=${n//0/{$2\}}          ;# Replace each "0" with "{a,b,...m}"
eval echo ${a//\}{/\},{} ;# Replace each "}{" with "},{" and evaluate the resulting brace expansion

Essayez-le en ligne!

Traumatisme numérique
la source
2

Java 10, 19 + 135 = 154 octets

import java.util.*;

List<List>f(Set l,int n){var o=new Stack();if(n<1)o.add(new Stack());else for(var t:l)for(var i:f(l,n-1)){i.add(t);o.add(i);}return o;}

Essayez-le en ligne

Non golfé

List<List> f(Set l, int n) {
    var o = new Stack();
    if (n < 1)
        o.add(new Stack());
    else
        for (var t : l)
            for (var i : f(l, n - 1)) {
                i.add(t);
                o.add(i);
            }
    return o;
}

Remerciements

  • port à Java 10 grâce à Kevin Cruijssen
Jakob
la source
Si vous utilisez Java 10 au lieu de 8, vous pouvez remplacer Objectet Listdans les boucles for-each varpar -4 octets. De plus, vous pouvez ensuite passer Set<List>fà List<List>fet Set o=new HashSet();à var o=new Stack();pour -1 octet supplémentaire. Essayez-le en ligne.
Kevin Cruijssen
Hmm. supprime les types pour les lambdas qui ne sont plus valides
ASCII uniquement
@ ASCII uniquement Non, les lambdas non typés sont autorisés. Je ne pouvais pas utiliser de lambda ici car la solution utilise la récursivité.
Jakob
@Jakob ah, c'est vrai> _>
ASCII uniquement
2

Oracle SQL, 177 octets

Créez un type de collection (31 octets):

CREATE TYPE t IS TABLE OF INT;

Utilisez ensuite la requête (146 octets):

WITH n(a,b,c)AS(SELECT a,b,t()FROM i UNION ALL SELECT a,b-1,c MULTISET UNION t(COLUMN_VALUE)FROM n,TABLE(n.a)WHERE b>=0)SELECT c FROM n WHERE b=0

En supposant que les paramètres d'entrée sont dans le tableau iavec des colonnes aet b:

CREATE TABLE i (a t,b INT) NESTED TABLE a STORE AS t_a;
INSERT INTO i VALUES ( t(1,2,3), 3 );

SQL Fiddle

Résultats :

|     C |
|-------|
| 1,1,1 |
| 1,1,2 |
| 1,1,3 |
| 1,2,1 |
| 1,2,2 |
| 1,2,3 |
| 1,3,1 |
| 1,3,2 |
| 1,3,3 |
| 2,1,1 |
| 2,1,2 |
| 2,1,3 |
| 2,2,1 |
| 2,2,2 |
| 2,2,3 |
| 2,3,1 |
| 2,3,2 |
| 2,3,3 |
| 3,1,1 |
| 3,1,2 |
| 3,1,3 |
| 3,2,1 |
| 3,2,2 |
| 3,2,3 |
| 3,3,1 |
| 3,3,2 |
| 3,3,3 |
MT0
la source
1

Bash , 61 octets

N=$1
shift
IFS=,
printf echo\\t%${N}s ""|sed "s/ /{$*},/g"|sh

Essayez-le en ligne! J'ai trouvé que répéter des chaînes et joindre des listes avec des virgules était étonnamment difficile à faire en bash.

Neil
la source
1

Javascript (Noeud) , 75 octets

c=(m,n,a,i)=>a.length-n?m.map((_,j)=>c(m,n,[...a,m[j]],i+1)):console.log(a)

Fonction récursive qui affiche la liste sur la console. Où aest un tableau vide et ivaut 0 (je ne sais pas si cela est toujours admissible):

c([1,2,3], 3, [], 0);

Essayez-le en ligne!

Endormi
la source
1
Je pense que vous auriez à faire(m,n,a=[],i=0)=>
Artyer
1

J , 17 octets

]{~(##)#:#@]i.@^[

Comment ça fonctionne?

nJ'énumère tous les nombres à -digit dans un système numérique avec base la longueur de la liste.

            i.         - creates a list from zero to (not including)
         #@]           - the length of the list 
              @^       - to the power of
                [      - n (left argument)
   (##)                - creates a list of n times the length of the list (for the bases)
       #:              - converts all the numbers into lists of digits in the new base
]{~                    - use the digits as indices into the list

Essayez-le en ligne!

Galen Ivanov
la source
1

CJam , 26 octets

q~(_"m*:e_"*\'_*@\~W$~:p];

Essayez-le en ligne!

Si seulement CJam avait des commandes à un caractère pour le produit cartésien et l'aplatissement.

maxb
la source