Producto cartesiano de una lista consigo mismo n veces

10

Cuando se le da una lista de valores y un número entero positivo n, su código debe generar el producto cartesiano de la lista con las nveces.

Por ejemplo, en pseudocódigo su función podría ser similar a:

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

Ejemplo:

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

Las funciones integradas (o funciones de bibliotecas importadas) que computan el producto cartesiano (o potencia) no están permitidas debido a que el código resultante es algo aburrido.

Las entradas y salidas deben delimitarse pero pueden tomarse de cualquier forma razonable.

el orden de salida no importa, pero no se permiten duplicados.

Esta es la primera vez que publico una pregunta, así que si hice algo terriblemente mal, dígamelo.

JoshM
fuente
55
Bienvenido a PPCG! No hay nada terriblemente malo, pero tómate un tiempo para mirar esta meta publicación y las respuestas. Cosas que debe evitar al escribir desafíos
JayCe
44
y para seguir el punto de @JayCe, podría (debería) publicar en The Sandbox para obtener comentarios antes de publicar una pregunta :-)
Giuseppe
@Giuseppe Ok, lo haré de ahora en adelante, gracias :)
JoshM
1
Borderline dupe de codegolf.stackexchange.com/q/125104/194
Peter Taylor
1
Los conjuntos de @Jakob deberían estar bien
JoshM,

Respuestas:

6

Lisp común , 146 bytes

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

Pruébalo en línea!

sin 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
fuente
2
normalmente sugerimos esperar otros envíos antes de publicar uno propio :-)
Giuseppe
1
@Giuseppe Ok, gracias por el consejo :)
JoshM
1
no es necesario que tenga la declaración de impresión en el envío, ya que se permite una función
solo ASCII el
1
entonces: 96
solo ASCII
1
90
Solo ASCII
6

R , 41 bytes

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

Pruébalo en línea!

combndefinitivamente no es un producto cartesiano incorporado, ya que calcula todas las ncombinaciones de su entrada.

R , 40 bytes

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

Pruébalo en línea!

expand.grid Es probablemente un producto cartesiano incorporado.

Giuseppe
fuente
Parece que el orden de permutaciones en su envío principal es incorrecto.
Kirill L.
@KirillL. ¿Hay alguna razón particular por la que el pedido sea importante? Interpreté la especificación de salida como lo suficientemente flexible como para permitirlos en cualquier orden.
Giuseppe
hay un comentario de OP "asegúrese de que la salida esté en el orden correcto", supuse que "correcto" significa lo mismo que en el ejemplo.
Kirill L.
@KirillL. Ah No vi eso; no está en el cuerpo de la pregunta, ¡así que no sabía que existía! Pediré que se ponga allí para aclarar.
Giuseppe
4

Perl 6 , 16 bytes

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

Intentalo

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
fuente
3

K (ngn / k) , 10 bytes

{x@+!y##x}

Pruébalo en línea!

{ }es una función con argumentos xyy

#x el largo de x

y##xla duración de los tiempos xrepetidosy

!y##x todas las tuplas de longitud y superior a 0,1, ..., longitud (x) -1 como matriz transpuesta

+ transponer

x@elementos de xen esos índices

ngn
fuente
3

APL (Dyalog Classic) , 18 12 bytes

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

Pruébalo en línea!

-6 bytes gracias a @ngn!

Zacharý
fuente
se puede utilizar con un argumento de vectores para generar índices y luego ⍺[ ]para obtener los valores correspondientes
NGN
Obtuve un RANK ERRORcuando intenté hacer eso.
Zacharý
la única trampa es con ⍵ = 1, en ese caso ⍳ devuelve un vector simple, no un vector de vectores de longitud-1 anidados como cabría esperar; es uno de esos errores que nunca se fija, por razones de compatibilidad hacia atrás
NGN
3

Python 2 , 69 58 bytes

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

Pruébalo en línea!

Toma una lista ay un número entero n; devuelve una lista de listas.

Chas Brown
fuente
3

Ruby , 53 bytes

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

Pruébalo en línea!

Enfoque recursivo, no tan corto, pero garantizado que estará libre de elementos integrados.

Es tentador usar métodos de permutación, pero esto probablemente no cuenta, y los documentos en realidad no ofrecen garantías de la corrección del orden, aunque parece funcionar en la práctica:

Ruby , 35 bytes

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

Pruébalo en línea!

Kirill L.
fuente
2

Raqueta, 92 bytes

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

Pruébalo en línea

Sin golf

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

Gelatina , 11 9 7 bytes

³;þẎƊ’¡

Pruébalo en línea!

Explicación

³;þẎƊ’¡
³;þẎ    **Implements** the cartesian product of a value with the input
    Ɗ   Groups those together
     ’¡ Repeat (n-1) times
Zacharý
fuente
Mira el comentario de OP: p
Zacharý
Mi comentario al que lo mencioné es: "También estoy asumiendo que las incorporaciones para todo el desafío también se rechazan", así que asumí que esto está bien.
Zacharý
Bueno, esperemos la OP entonces
Zacharý
@ Zacharý lo siento, la función de poder cartesiana no está permitida
JoshM
3
No sé, dos anidados para bucles como ese es básicamente la definición de un producto cartesiano. Sin embargo, no estoy diciendo que debas cambiarlo, solo creo que prohibir lo incorporado en este desafío no está claro.
dylnan
2

Pure Bash (sin utilidades externas), 57

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

La entrada se proporciona como parámetros de línea de comandos; Primero es n, segundo es una lista separada por comas.

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

Pruébalo en línea!

Trauma digital
fuente
2

Java 10, 19 + 135 = 154 bytes

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

Pruébalo en línea

Sin 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;
}

Expresiones de gratitud

  • puerto a Java 10 gracias a Kevin Cruijssen
Jakob
fuente
Si usa Java 10 en lugar de 8, puede cambiar Objecty Listen los bucles for-each varpara -4 bytes. Además, puede luego cambiar Set<List>fa List<List>fy Set o=new HashSet();a var o=new Stack();un byte adicional -1. Pruébalo en línea.
Kevin Cruijssen
Hmm deja de lado los tipos para lambdas que ya no son válidos
solo ASCII
@ Solo ASCII No, se permiten lambdas sin tipo. No pude usar una lambda aquí porque la solución usa la recursividad.
Jakob
@Jakob ah, es cierto> _>
Solo ASCII
2

Oracle SQL, 177 bytes

Cree un tipo de colección (31 bytes):

CREATE TYPE t IS TABLE OF INT;

Luego use la consulta (146 bytes):

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

Suponiendo que los parámetros de entrada están en la tabla icon columnas ay b:

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

Violín de SQL

Resultados :

|     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
fuente
1

Bash , 61 bytes

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

Pruébalo en línea! Encontré repetidamente cadenas y uniendo listas con comas sorprendentemente difíciles de hacer en bash.

Neil
fuente
1

Javascript (Nodo) , 75 bytes

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

Función recursiva que envía la lista a la consola. Donde ahay una matriz vacía y ies 0 (no estoy seguro si esto aún califica)

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

Pruébalo en línea!

Asleepace
fuente
1
Creo que tendrías que hacerlo(m,n,a=[],i=0)=>
Artyer
1

J , 17 bytes

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

¿Cómo funciona?

nEnumero todos los números de dígitos en un sistema de números con base en la longitud de la lista.

            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

Pruébalo en línea!

Galen Ivanov
fuente
1

CJam , 26 bytes

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

Pruébalo en línea!

Si solo CJam tuviera comandos de un carácter para el producto cartesiano y el aplanamiento.

maxb
fuente
0

Octava , 38 bytes

@(x,n)x(dec2base(0:n^numel(x)-1,n)-47)

Función anónima que toma un vector de fila de valores y un número entero.

Pruébalo en línea!

Luis Mendo
fuente