Produk Cartesian dari daftar dengan sendirinya n kali

10

Ketika diberi daftar nilai dan bilangan bulat positif n, kode Anda harus menampilkan produk cartesian dari daftar dengan nwaktu itu sendiri .

Misalnya, dalam pseudocode fungsi Anda bisa mirip dengan:

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

Contoh:

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

Fungsi bawaan (atau fungsi dari perpustakaan yang diimpor) yang menghitung produk Cartesian (atau daya) tidak diizinkan karena kode yang dihasilkan agak membosankan.

Input dan output harus dibatasi tetapi dapat diambil dengan metode yang masuk akal.

urutan output diberikan tidak masalah tetapi duplikat tidak diperbolehkan.

Ini adalah pertama kalinya saya memposting pertanyaan, jadi jika saya melakukan sesuatu yang salah, tolong beri tahu saya.

JoshM
sumber
5
Selamat datang di PPCG! Tidak ada yang salah, tetapi luangkan waktu untuk melihat postingan dan jawaban meta ini. Hal-hal yang harus dihindari ketika menulis tantangan
JayCe
4
dan untuk mengikuti poin @JayCe, Anda dapat (harus) memposting di The Sandbox untuk mendapatkan umpan balik sebelum memposting pertanyaan :-)
Giuseppe
@ Giuseppe Ok, saya akan mulai sekarang, terima kasih :)
JoshM
1
Borderline dupe dari codegolf.stackexchange.com/q/125104/194
Peter Taylor
1
@Jakob set harus baik
JoshM

Jawaban:

6

Gangguan Umum , 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)))

Cobalah 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))))))
JoshM
sumber
2
biasanya kami sarankan menunggu pengiriman lain sebelum memposting salah satu dari Anda sendiri :-)
Giuseppe
1
@Giuseppe Ok, terima kasih atas sarannya :)
JoshM
1
Anda tidak harus memiliki pernyataan cetak dalam kiriman, karena fungsi diperbolehkan
ASCII-satunya
1
jadi: 96
ASCII
1
90
ASCII
6

R , 41 byte

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

Cobalah online!

combnjelas bukan produk cartesian bawaan, karena ia menghitung semua n-kombinasi dari inputnya.

R , 40 byte

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

Cobalah online!

expand.grid mungkin merupakan produk bawaan cartesian.

Giuseppe
sumber
Sepertinya urutan permutasi dalam kiriman utama Anda salah.
Kirill L.
@ KirillL. apakah ada alasan tertentu urutannya penting? Saya menafsirkan spesifikasi output sebagai cukup fleksibel untuk memungkinkan mereka dalam urutan apa pun.
Giuseppe
ada komentar OP "pastikan output dalam urutan yang benar", saya anggap "benar" berarti sama seperti pada contoh.
Kirill L.
@ KirillL. Ah. Tidak melihat itu; itu tidak ada dalam tubuh pertanyaan jadi saya tidak tahu itu ada! Saya akan meminta agar dimasukkan ke sana untuk klarifikasi.
Giuseppe
4

Perl 6 , 16 byte

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

Cobalah

Diperluas:

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

K (ngn / k) , 10 byte

{x@+!y##x}

Cobalah online!

{ }adalah fungsi dengan argumen xdany

#x panjangnya x

y##xpanjangnya waktu yang xberulangy

!y##x semua panjang-y tupel lebih dari 0,1, ..., panjang (x) -1 sebagai matriks transposisi

+ mengubah urutan

x@elemen xpada indeks tersebut

ngn
sumber
3

APL (Dyalog Classic) , 18 12 byte

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

Cobalah online!

-6 byte terima kasih kepada @ngn!

Zacharý
sumber
Anda dapat menggunakan dengan argumen vektor untuk menghasilkan indeks dan kemudian ⍺[ ]untuk mendapatkan nilai yang sesuai
ngn
Saya mendapat RANK ERRORketika saya mencoba melakukan itu.
Zacharý
satu-satunya tangkapan adalah dengan ⍵ = 1, dalam hal ini ⍳ mengembalikan vektor polos, bukan vektor vektor panjang-1 seperti yang diharapkan; itu adalah salah satu bug yang tidak pernah diperbaiki, karena alasan kompatibilitas ke belakang
ngn
3

Perl 5 , 33 byte

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

Cobalah online!

Xcali
sumber
Bagus! Begitu banyak jawaban yang dapat memanfaatkan ini akhir-akhir ini! Anda dapat menghemat 2 byte dengan sedikit juggling: Cobalah online!
Dom Hastings
3

Python 2 , 69 58 byte

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

Cobalah online!

Mengambil daftar adan bilangan bulat n; mengembalikan daftar daftar.

Chas Brown
sumber
3

Ruby , 53 byte

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

Cobalah online!

Pendekatan rekursif, tidak terlalu pendek, tetapi dijamin bebas dari built-in.

Sangat menggoda untuk menggunakan metode permutasi, tetapi ini mungkin tidak masuk hitungan, dan dokumen sebenarnya tidak menyatakan jaminan kebenaran urutan, meskipun tampaknya bekerja dalam praktik:

Ruby , 35 byte

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

Cobalah online!

Kirill L.
sumber
2

Prolog (SWI) , 72 byte

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

Cobalah online!

Khusus ASCII
sumber
2

Racket, 92 byte

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

Cobalah secara Online

Tidak disatukan

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

Jelly , 11 9 7 byte

³;þẎƊ’¡

Cobalah online!

Penjelasan

³;þẎƊ’¡
³;þẎ    **Implements** the cartesian product of a value with the input
    Ɗ   Groups those together
     ’¡ Repeat (n-1) times
Zacharý
sumber
Lihatlah komentar OP: p
Zacharý
Komentar saya yang saya kemukakan adalah: "Saya juga berasumsi bahwa builtin untuk seluruh tantangan juga dibungkam," jadi saya hanya berasumsi ini baik-baik saja.
Zacharý
Baiklah, mari kita tunggu OP
Zacharý
@ Zacharý maaf, fungsi daya kartesian tidak diizinkan
JoshM
3
Saya tidak tahu, dua bersarang untuk loop seperti itu pada dasarnya adalah definisi produk kartesius. Saya tidak mengatakan Anda harus mengubahnya, saya hanya berpikir melarang built-in dalam tantangan ini agak tidak jelas.
dylnan
2

Bash murni (tanpa utilitas eksternal), 57

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

Input diberikan sebagai parameter baris perintah; Pertama adalah n, kedua adalah daftar yang dipisahkan koma.

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

Cobalah online!

Trauma Digital
sumber
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;}

Cobalah secara Online

Tidak disatukan

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

Ucapan Terima Kasih

  • port ke Java 10 berkat Kevin Cruijssen
Jakob
sumber
Jika Anda menggunakan Java 10 bukannya 8, Anda dapat mengubah Objectdan Listdi masing-masing loop ke varuntuk -4 byte. Selain itu, Anda kemudian dapat mengubah Set<List>fke List<List>fdan Set o=new HashSet();ke var o=new Stack();-1 byte tambahan. Cobalah online.
Kevin Cruijssen
Hmm. meninggalkan jenis untuk lambdas tidak lagi berlaku
ASCII-satunya
@ Khusus ASCII Tidak, lambda yang tidak diketik diizinkan. Saya tidak bisa menggunakan lambda di sini karena solusinya menggunakan rekursi.
Jakob
@ Jakob ah, itu benar> _>
ASCII-satunya
2

Oracle SQL, 177 byte

Buat jenis koleksi (31 byte):

CREATE TYPE t IS TABLE OF INT;

Kemudian gunakan kueri (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

Dengan asumsi bahwa parameter input ada di tabel idengan kolom adan 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

Hasil :

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

Bash , 61 byte

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

Cobalah online! Saya menemukan string berulang dan bergabung dengan daftar dengan koma sangat sulit dilakukan di bash.

Neil
sumber
1

Javascript (Node) , 75 byte

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

Fungsi rekursif yang menampilkan daftar ke konsol. Di mana aarray kosong dan i0 (tidak yakin apakah ini masih memenuhi syarat):

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

Cobalah online!

Tertidur
sumber
1
Saya pikir Anda harus melakukan(m,n,a=[],i=0)=>
Artyer
1

J , 17 byte

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

Bagaimana itu bekerja?

Saya menghitung semua nangka -digit dalam sistem angka dengan mendasarkan panjang daftar.

            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

Cobalah online!

Galen Ivanov
sumber
1

CJam , 26 byte

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

Cobalah online!

Andai saja CJam memiliki perintah satu karakter untuk produk cartesian dan perataan.

maks
sumber
0

Oktaf , 38 byte

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

Fungsi anonim yang mengambil vektor baris nilai dan integer.

Cobalah online!

Luis Mendo
sumber
0

Pari / GP , 46 byte

(l,n)->matrix(#l^n,n,i,j,l[i--\#l^(n-j)%#l+1])

Cobalah online!

alephalpha
sumber