Kartezjański produkt z listy n razy

10

Gdy otrzymasz listę wartości i dodatnią liczbę całkowitą n, twój kod powinien wypisać iloczyn kartezjański listy razem z nczasem.

Na przykład w pseudokodzie funkcja może być podobna do:

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

Przykład:

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

Wbudowane funkcje (lub funkcje z importowanych bibliotek), które obliczają iloczyn kartezjański (lub moc) są niedozwolone, ponieważ wynikowy kod jest nieco nudny.

Wejścia i wyjścia powinny być ograniczone, ale można je przyjąć dowolną rozsądną metodą.

kolejność danych wyjściowych nie ma znaczenia, ale duplikaty nie są dozwolone.

Po raz pierwszy zadaję pytanie, więc jeśli zrobiłem coś okropnie złego, proszę, powiedz mi.

JoshM
źródło
5
Witamy w PPCG! Nic strasznie złego, ale poświęć trochę czasu, aby spojrzeć na ten meta post i odpowiedzi. Czego unikać, pisząc wyzwania
JayCe
4
i postępując zgodnie z punktem @JayCe, możesz (powinien) napisać w The Sandbox, aby uzyskać opinię przed opublikowaniem pytania :-)
Giuseppe
@Giuseppe Ok, zrobię to teraz, dzięki :)
JoshM
1
Borderline dupe z codegolf.stackexchange.com/q/125104/194
Peter Taylor
1
Zestawy @Jakob powinny być w porządku
JoshM

Odpowiedzi:

6

Common Lisp , 146 bajtów

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

Wypróbuj online!

bez golfa

(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
źródło
2
zazwyczaj sugerujemy poczekanie na inne zgłoszenia przed opublikowaniem jednego z nich :-)
Giuseppe
1
@Giuseppe Ok, dzięki za radę :)
JoshM
1
nie musisz mieć instrukcji print w przedłożeniu, ponieważ funkcja jest dozwolona
tylko ASCII
1
tak: 96
tylko ASCII
1
90
Tylko ASCII
6

R , 41 bajtów

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

Wypróbuj online!

combnzdecydowanie nie jest wbudowanym produktem kartezjańskim, ponieważ oblicza wszystkie nkombinacje danych wejściowych.

R , 40 bajtów

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

Wypróbuj online!

expand.grid jest prawdopodobnie wbudowanym produktem kartezjańskim.

Giuseppe
źródło
Wygląda na to, że kolejność permutacji w głównym przesłaniu jest nieprawidłowa.
Kirill L.
@KirillL. czy jest jakiś konkretny powód, dla którego zamówienie jest ważne? Zinterpretowałem specyfikację wyjściową jako wystarczająco elastyczną, aby pozwolić na nią w dowolnej kolejności.
Giuseppe
jest komentarz OP „upewnij się, że wyjście jest we właściwej kolejności”, przypuszczałem, że „właściwy” oznacza to samo, co w przykładzie.
Kirill L.
@KirillL. Ach Nie widziałem tego; nie ma go w treści pytania, więc nie wiedziałem, że istnieje! Poproszę o umieszczenie go tam w celu wyjaśnienia.
Giuseppe
4

Perl 6 , 16 bajtów

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

Spróbuj

Wydane:

{  # 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
źródło
3

K (ngn / k) , 10 bajtów

{x@+!y##x}

Wypróbuj online!

{ }jest funkcją z argumentami xiy

#x długość x

y##xdługość xpowtarzanych yczasów

!y##x wszystkie krotki długości y powyżej 0,1, ..., długość (x) -1 jako transponowana macierz

+ transponować

x@elementy xtych wskaźników

ngn
źródło
3

APL (Dyalog Classic) , 18 12 bajtów

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

Wypróbuj online!

-6 bajtów dzięki @ngn!

Zacharý
źródło
Państwo może skorzystać z argumentem wektora do generowania indeksów, a następnie ⍺[ ], aby uzyskać odpowiednie wartości
NGN
Dostałem RANK ERRORkiedy próbowałem to zrobić.
Zacharý
jedynym haczykiem jest ⍵ = 1, w takim przypadku ⍳ zwraca prosty wektor, a nie wektor zagnieżdżonych wektorów o długości-1, jak można się spodziewać; jest to jeden z tych błędów, które nigdy nie zostaną naprawione, z powodów kompatybilności wstecznej
ngn
3

Perl 5 , 33 bajtów

say for glob(join',',("{$_}")x<>)

Wypróbuj online!

Xcali
źródło
Miły! Tak wiele odpowiedzi było ostatnio w stanie to wykorzystać! Możesz zaoszczędzić 2 bajty przy odrobinie żonglowania: Wypróbuj online!
Dom Hastings,
3

Python 2 , 69 58 bajtów

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

Wypróbuj online!

Pobiera listę ai liczbę całkowitą n; zwraca listę list.

Chas Brown
źródło
3

Rubin , 53 bajty

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

Wypróbuj online!

Podejście rekurencyjne, nie tak krótkie, ale z pewnością pozbawione jakichkolwiek wbudowanych elementów.

Kuszące jest stosowanie metod permutacji, ale to chyba się nie liczy, a dokumenty faktycznie nie podają żadnych gwarancji poprawności zamówienia, choć wydaje się, że działa w praktyce:

Rubin , 35 bajtów

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

Wypróbuj online!

Kirill L.
źródło
2

Prolog (SWI) , 72 bajty

R-1-R.
L-N-R:-O is N-1,L-O-M,findall([H|T],(member(H,L),member(T,M)),R).

Wypróbuj online!

Tylko ASCII
źródło
2

Rakieta, 92 bajty

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

Wypróbuj online

Nie golfił

(define (f l n)
    (if (> n 0)
        (apply append
            (map
                (λ (r)
                    (map (λ (e) (cons e r)) l)
                )
                (f l (- n 1))
            )
        )
        '(())
    )
)
Jakob
źródło
2

Galaretka , 11 9 7 bajtów

³;þẎƊ’¡

Wypróbuj online!

Wyjaśnienie

³;þẎƊ’¡
³;þẎ    **Implements** the cartesian product of a value with the input
    Ɗ   Groups those together
     ’¡ Repeat (n-1) times
Zacharý
źródło
Spójrz na komentarz OP: p
Zacharý
Mój komentarz, do którego wspomniałem, brzmi: „Zakładam również, że wbudowane dla całego wyzwania są również niedozwolone”, więc po prostu założyłem, że jest w porządku.
Zacharý
Cóż, poczekajmy więc na OP
Zacharý
@ Zacharý przepraszam, funkcja kartezjańska nie jest dozwolona
JoshM
3
Nie wiem, dwa zagnieżdżone dla takich pętli to w zasadzie definicja produktu kartezjańskiego. Nie twierdzę jednak, że powinieneś to zmienić, po prostu uważam, że zakazanie wbudowania w to wyzwanie jest niejasne.
dylnan
2

Pure Bash (bez zewnętrznych narzędzi), 57

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

Dane wejściowe podano jako parametry wiersza polecenia; 1st is n, 2nd to lista rozdzielona przecinkami.

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

Wypróbuj online!

Cyfrowa trauma
źródło
2

Java 10, 19 + 135 = 154 bajtów

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

Wypróbuj online

Nie golfił

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

Podziękowanie

  • przenieś na Javę 10 dzięki Kevin Cruijssen
Jakob
źródło
Jeśli używasz Java 10 zamiast 8, można zmienić Objecti Listw for-each pętli do vardo -4 bajtów. Ponadto, można następnie zmienić Set<List>fsię List<List>fi Set o=new HashSet();aby var o=new Stack();za dodatkową -1 bajt. Wypróbuj online.
Kevin Cruijssen
Hmm pomija typy lambdas, które nie są już ważne
tylko ASCII
@ Tylko ASCII Nie, niedopuszczone lambdy są dozwolone. Nie mogłem użyć lambda, ponieważ rozwiązanie wykorzystuje rekurencję.
Jakob
@Jakob ah, zgadza się> _>
tylko ASCII
2

Oracle SQL, 177 bajtów

Utwórz typ kolekcji (31 bajtów):

CREATE TYPE t IS TABLE OF INT;

Następnie użyj zapytania (146 bajtów):

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

Zakładając, że parametry wejściowe znajdują się w tabeli iz kolumnami ai 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

Wyniki :

|     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
źródło
1

Bash , 61 bajtów

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

Wypróbuj online! Znalazłem powtarzanie ciągów i łączenie list przecinkami zaskakująco trudne do zrobienia w bash.

Neil
źródło
1

JavaScript (węzeł) , 75 bajtów

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

Funkcja rekurencyjna, która wysyła listę do konsoli. Gdzie ajest pusta tablica i iwynosi 0 (nie jestem pewien, czy nadal się kwalifikuje):

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

Wypróbuj online!

Śpiący
źródło
1
Myślę, że musiałbyś to zrobić(m,n,a=[],i=0)=>
Artyer
1

J , 17 bajtów

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

Jak to działa?

nWyliczam wszystkie cyfry-cyfry w systemie liczbowym o podstawie długości listy.

            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

Wypróbuj online!

Galen Iwanow
źródło
1

CJam , 26 bajtów

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

Wypróbuj online!

Gdyby tylko CJam miał jeden znak polecenia dla kartezjańskiego produktu i spłaszczania.

maxb
źródło
0

Oktawa , 38 bajtów

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

Anonimowa funkcja, która pobiera wektor wiersza wartości i liczbę całkowitą.

Wypróbuj online!

Luis Mendo
źródło