Kartesisches Produkt einer Liste mit sich selbst n-mal

10

Wenn Sie eine Werteliste und eine positive Ganzzahl erhalten n, sollte Ihr Code das kartesische Produkt der Liste mit sich selbst nmal ausgeben .

Im Pseudocode könnte Ihre Funktion beispielsweise ähnlich sein wie:

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

Beispiel:

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

Eingebaute Funktionen (oder Funktionen aus importierten Bibliotheken), die das kartesische Produkt (oder die Leistung) berechnen, sind nicht zulässig, da der resultierende Code etwas langweilig ist.

Ein- und Ausgänge sollten abgegrenzt werden, können aber mit jeder vernünftigen Methode durchgeführt werden.

Die Reihenfolge, in der die Ausgabe erfolgt, spielt keine Rolle, Duplikate sind jedoch nicht zulässig.

Dies ist mein erstes Mal, dass ich eine Frage stelle. Wenn ich also etwas schrecklich Falsches getan habe, sag es mir bitte.

JoshM
quelle
5
Willkommen bei PPCG! Nichts schrecklich Falsches, aber nehmen Sie sich etwas Zeit, um sich diesen Meta-Beitrag und die Antworten anzusehen. Dinge zu vermeiden, wenn Sie Herausforderungen schreiben
JayCe
4
und um @JayCes Punkt zu folgen, könnten (sollten) Sie in The Sandbox posten , um Feedback zu erhalten, bevor Sie eine Frage stellen :-)
Giuseppe
@ Giuseppe Ok, ich mache das von jetzt an, danke :)
JoshM
1
Borderline-Betrüger von codegolf.stackexchange.com/q/125104/194
Peter Taylor
1
@ Jakob Sets sollten in Ordnung sein
JoshM

Antworten:

6

Common Lisp , 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)))

Probieren Sie es online aus!

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))))))
JoshM
quelle
2
Normalerweise empfehlen wir, auf andere Einsendungen zu warten, bevor Sie eine Ihrer eigenen veröffentlichen :-)
Giuseppe
1
@ Giuseppe Ok, danke für den Rat :)
JoshM
1
Sie müssen die print-Anweisung nicht in der Übermittlung haben, da eine Funktion zulässig ist
ASCII-only
1
also: 96
ASCII-
1
90
Nur ASCII
6

R 41 Bytes

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

Probieren Sie es online aus!

combnist definitiv kein eingebautes kartesisches Produkt, da es alle nKombinationen seiner Eingabe berechnet .

R , 40 Bytes

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

Probieren Sie es online aus!

expand.grid ist wahrscheinlich ein kartesisches Produkt eingebaut.

Giuseppe
quelle
Es sieht so aus, als ob die Reihenfolge der Permutationen in Ihrer Hauptübermittlung falsch ist.
Kirill L.
@ KirillL. Gibt es einen bestimmten Grund, warum die Reihenfolge wichtig ist? Ich habe die Ausgabespezifikation als flexibel genug interpretiert, um sie in beliebiger Reihenfolge zuzulassen.
Giuseppe
Es gibt den Kommentar von OP "Stellen Sie sicher, dass die Ausgabe in der richtigen Reihenfolge ist". Ich nahm an, dass "richtig" dasselbe bedeutet wie im Beispiel.
Kirill L.
@ KirillL. Ah. Hab das nicht gesehen; Es ist nicht im Hauptteil der Frage, also wusste ich nicht, dass es existiert! Ich werde darum bitten, dass es zur Klärung dort abgelegt wird.
Giuseppe
4

Perl 6 , 16 Bytes

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

Versuch es

Erweitert:

{  # 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
quelle
3

K (ngn / k) , 10 Bytes

{x@+!y##x}

Probieren Sie es online aus!

{ }ist eine Funktion mit Argumenten xundy

#x die Länge von x

y##xdie Länge der xwiederholten yZeiten

!y##x alle Länge-y-Tupel über 0,1, ..., Länge (x) -1 als transponierte Matrix

+ transponieren

x@Elemente xan diesen Indizes

ngn
quelle
3

APL (Dyalog Classic) , 18 bis 12 Byte

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

Probieren Sie es online aus!

-6 Bytes dank @ngn!

Zacharý
quelle
Sie können verwendet werden mit einem Vektor Argumente Indizes zu erzeugen und dann ⍺[ ]die entsprechenden Werte zu erhalten
ngn
Ich habe eine bekommen, RANK ERRORals ich das versucht habe.
Zacharý
der einzige Haken ist mit ⍵ = 1, in diesem Fall gibt ⍳ einen einfachen Vektor zurück, nicht einen Vektor verschachtelter Längen-1-Vektoren, wie man es erwarten würde; Es ist einer dieser Fehler, die aus Gründen der
Abwärtskompatibilität
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[[]]

Probieren Sie es online aus!

Nimmt eine Liste aund eine ganze Zahl n; Gibt eine Liste von Listen zurück.

Chas Brown
quelle
3

Ruby , 53 Bytes

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

Probieren Sie es online aus!

Rekursiver Ansatz, nicht so kurz, aber garantiert frei von Einbauten.

Es ist verlockend, Permutationsmethoden zu verwenden, aber dies zählt wahrscheinlich nicht, und die Dokumente geben tatsächlich keine Garantie für die Richtigkeit der Bestellung an, obwohl dies in der Praxis zu funktionieren scheint:

Ruby , 35 Bytes

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

Probieren Sie es online aus!

Kirill L.
quelle
2

Schläger, 92 Bytes

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

Probieren Sie es online aus

Ungolfed

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

Gelee , 11 9 7 Bytes

³;þẎƊ’¡

Probieren Sie es online aus!

Erläuterung

³;þẎƊ’¡
³;þẎ    **Implements** the cartesian product of a value with the input
    Ɗ   Groups those together
     ’¡ Repeat (n-1) times
Zacharý
quelle
Schauen Sie sich den Kommentar von OP an: p
Zacharý
Mein Kommentar, auf den ich es angesprochen habe, lautet: "Ich gehe auch davon aus, dass eingebaute Elemente für die gesamte Herausforderung ebenfalls nicht zugelassen sind", also habe ich nur angenommen, dass dies in Ordnung ist.
Zacharý
Nun, dann warten wir auf OP
Zacharý
@ Zacharý sorry, die kartesische Power-Funktion ist nicht erlaubt
JoshM
3
Ich weiß nicht, zwei solche verschachtelten Schleifen sind im Grunde die Definition eines kartesischen Produkts. Ich sage nicht, dass Sie es ändern sollten, ich denke nur, dass das Verbot der in diese Herausforderung eingebauten Herausforderung irgendwie unklar ist.
Dylnan
2

Pure Bash (keine externen Dienstprogramme), 57

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

Die Eingabe erfolgt als Befehlszeilenparameter. 1. ist n, 2. ist eine durch Kommas getrennte Liste.

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

Probieren Sie es online aus!

Digitales Trauma
quelle
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;}

Probieren Sie es online aus

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

Danksagung

  • Port auf Java 10 dank Kevin Cruijssen
Jakob
quelle
Wenn Sie Java 10 anstelle von 8 verwenden, können Sie Objectund Listin den for-each-Schleifen auf var-4 Bytes ändern . Außerdem können Sie dann für ein zusätzliches -1-Byte Set<List>fzu List<List>fund Set o=new HashSet();nach wechseln var o=new Stack();. Probieren Sie es online aus.
Kevin Cruijssen
Hmm. lässt Typen für Lambdas aus, die nicht mehr gültig sind
ASCII-only
@ Nur ASCII Nein, untypisierte Lambdas sind erlaubt. Ich konnte hier kein Lambda verwenden, da die Lösung Rekursion verwendet.
Jakob
@ Jakob ah, das ist richtig> _>
ASCII-
2

Oracle SQL, 177 Bytes

Erstellen Sie einen Sammlungstyp (31 Byte):

CREATE TYPE t IS TABLE OF INT;

Verwenden Sie dann die Abfrage (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

Angenommen, die Eingabeparameter befinden sich in der Tabelle imit den Spalten aund 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

Ergebnisse :

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

Bash , 61 Bytes

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

Probieren Sie es online aus! Ich fand es überraschend schwierig, Strings zu wiederholen und Listen mit Kommas zu verbinden.

Neil
quelle
1

Javascript (Knoten) , 75 Bytes

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

Rekursive Funktion, die die Liste an die Konsole ausgibt. Wo aist ein leeres Array und iist 0 (nicht sicher, ob dies noch qualifiziert ist):

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

Probieren Sie es online aus!

Schlafend
quelle
1
Ich denke, Sie müssten tun(m,n,a=[],i=0)=>
Artyer
1

J , 17 Bytes

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

Wie es funktioniert?

Ich nzähle alle -stelligen Zahlen in einem Zahlensystem mit der Länge der Liste auf.

            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

Probieren Sie es online aus!

Galen Ivanov
quelle
1

CJam , 26 Bytes

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

Probieren Sie es online aus!

Wenn CJam nur ein Zeichen Befehle für kartesisches Produkt und Abflachung hätte.

maxb
quelle