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.


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

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


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.


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
}

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


3

APL (Dyalog Classic) , 18 12 bajtów

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

Wypróbuj online!

-6 bajtów dzięki @ngn!


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

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!



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

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

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!


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

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 |

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.


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!


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!




Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.