Prodotto cartesiano di un elenco con se stesso n volte


10

Quando viene fornito un elenco di valori e un numero intero positivo n, il codice dovrebbe generare il prodotto cartesiano dell'elenco con i ntempi stessi .

Ad esempio, nello pseudocodice la tua funzione potrebbe essere simile a:

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

Esempio:

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

Le funzioni incorporate (o le funzioni delle librerie importate) che calcolano il prodotto (o la potenza) cartesiana non sono consentite a causa del codice risultante piuttosto noioso.

Ingressi e uscite dovrebbero essere delimitati ma possono essere presi in qualsiasi metodo ragionevole.

l'ordine in cui viene fornito l'output non ha importanza, ma i duplicati non sono consentiti.

Questa è la prima volta che inserisco una domanda, quindi se ho fatto qualcosa di orribilmente sbagliato, per favore dimmelo.


5
Benvenuti in PPCG! Niente di terribilmente sbagliato, ma prenditi del tempo per guardare questo meta post e le risposte. Cose da evitare quando si scrivono sfide
JayCe

4
e per seguire il punto di @JayCe, potresti (dovresti) pubblicare su The Sandbox per ottenere feedback prima di pubblicare una domanda :-)
Giuseppe,

@Giuseppe Ok, lo farò d'ora in poi, grazie :)
JoshM,


1
I set di
@Jakob

Risposte:



6

Lisp comune , 146 byte

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

Provalo online!

ungolfed

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

2
in genere ti consigliamo di attendere altri invii prima di pubblicarne uno tuo :-)
Giuseppe

1
@Giuseppe Ok, grazie per il consiglio :)
JoshM

1
non è necessario avere l'istruzione print nell'invio, poiché una funzione è consentita
solo ASCII

1
quindi: 96
ASCII


6

R , 41 byte

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

Provalo online!

combnnon è sicuramente un prodotto cartesiano incorporato, poiché calcola tutte le ncombinazioni del suo input.

R , 40 byte

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

Provalo online!

expand.grid è probabilmente un prodotto cartesiano incorporato.


Sembra che l'ordine delle permutazioni nella presentazione principale sia errato.
Kirill L.,

@KirillL. c'è un motivo particolare per cui l'ordine è importante? Ho interpretato le specifiche di output come abbastanza flessibili da consentirle in qualsiasi ordine.
Giuseppe,

c'è il commento di OP "assicurarsi che l'output sia nell'ordine giusto", presumo che "giusto" significhi lo stesso dell'esempio.
Kirill L.,

@KirillL. Ah. Non l'ho visto; non è nel corpo della domanda, quindi non sapevo che esistesse! Chiederò che venga messo lì per chiarimenti.
Giuseppe,

4

Perl 6 , 16 byte

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

Provalo

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
}

3

K (ngn / k) , 10 byte

{x@+!y##x}

Provalo online!

{ }è una funzione con argomenti xey

#x la lunghezza di x

y##xla lunghezza dei tempi xripetutiy

!y##x tutte le tuple a lunghezza superiore a 0,1, ..., lunghezza (x) -1 come matrice trasposta

+ trasporre

x@elementi di xquegli indici


3

APL (Dyalog Classic) , 18 12 byte

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

Provalo online!

-6 byte grazie a @ngn!


si può usare con un argomento vettore per generare indici e quindi ⍺[ ]per ottenere i valori corrispondenti
NGN

Ho avuto un RANK ERRORmomento in cui ho provato a farlo.
Zacharý,


l'unica cattura è con ⍵ = 1, in quel caso ⍳ restituisce un vettore semplice, non un vettore di vettori nidificati di lunghezza 1 come ci si aspetterebbe; è uno di quei bug che non vengono mai corretti, per motivi di retrocompatibilità
ngn



3

Rubino , 53 byte

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

Provalo online!

Approccio ricorsivo, non così breve, ma garantito per essere privo di qualsiasi built-in.

È allettante utilizzare metodi di permutazione, ma questo probabilmente non conta, e i documenti in realtà non forniscono garanzie sulla correttezza dell'ordine, anche se sembra funzionare nella pratica:

Rubino , 35 byte

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

Provalo online!



2

Racchetta, 92 byte

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

Provalo online

Ungolfed

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

2

Gelatina , 11 9 7 byte

³;þẎƊ’¡

Provalo online!

Spiegazione

³;þẎƊ’¡
³;þẎ    **Implements** the cartesian product of a value with the input
    Ɗ   Groups those together
     ’¡ Repeat (n-1) times

Guarda il commento di OP: p
Zacharý,

Il mio commento al quale l'ho sollevato è: "Sto anche supponendo che i builtin per l'intera sfida siano anch'essi non approvati", quindi ho solo pensato che andasse bene.
Zacharý,

Bene, allora aspettiamo OP
Zacharý

@ Zacharý scusa, la funzione di potenza cartesiana non è consentita
JoshM,

3
Non lo so, due nidificati per loop come quello sono fondamentalmente la definizione di un prodotto cartesiano. Non sto dicendo che dovresti cambiarlo però, penso solo che vietare il built-in in questa sfida non sia chiaro.
dylnan,

2

Pure Bash (nessuna utility esterna), 57

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

L'input viene fornito come parametro della riga di comando; 1o è n, 2o è un elenco separato da virgole.

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

Provalo online!


2

Java 10, 19 + 135 = 154 byte

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

Provalo online

Ungolfed

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

Ringraziamenti

  • porta a Java 10 grazie a Kevin Cruijssen

Se si utilizza Java 10 anziché 8, è possibile modificare Objecte Listnei cicli for-each in var-4 byte. Inoltre, si può quindi cambiare Set<List>fper List<List>fe Set o=new HashSet();per var o=new Stack();un ulteriore -1 byte. Provalo online.
Kevin Cruijssen,

Hmm. sta lasciando fuori i tipi per lambda non più validi
ASCII-solo

@ Solo ASCII No, sono ammessi lambda non tipizzati. Non ho potuto usare un lambda qui perché la soluzione utilizza la ricorsione.
Jakob,

@Jakob ah, è vero> _>
ASCII

2

Oracle SQL, 177 byte

Crea un tipo di raccolta (31 byte):

CREATE TYPE t IS TABLE OF INT;

Quindi utilizzare la query (146 byte):

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

Supponendo che i parametri di input siano nella tabella icon colonne ae 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

Risultati :

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

1

Bash , 61 byte

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

Provalo online! Ho trovato stringhe ripetute e unire liste con virgole sorprendentemente difficili da fare in bash.


1

Javascript (nodo) , 75 byte

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

Funzione ricorsiva che invia l'elenco alla console. Dove aè un array vuoto ed iè 0 (non sono sicuro se questo è ancora valido):

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

Provalo online!


1
Penso che dovresti farlo(m,n,a=[],i=0)=>
Artyer


1

J , 17 byte

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

Come funziona?

nElenco tutti i numeri -digit in un sistema numerico con base per la lunghezza dell'elenco.

            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

Provalo online!


1

CJam , 26 byte

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

Provalo online!

Se solo CJam avesse un comando di carattere per il prodotto cartesiano e l'appiattimento.



Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.