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.


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

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


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.


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
}

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


3

APL (Dyalog Classic) , 18 12 byte

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

Cobalah online!

-6 byte terima kasih kepada @ngn!


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

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!



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

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

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!


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

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 |

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.


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!


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!


1

CJam , 26 byte

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

Cobalah online!

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



Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.