Sản phẩm của Cartesian của một danh sách với chính nó n lần


10

Khi được đưa ra một danh sách các giá trị và số nguyên dương n, mã của bạn sẽ xuất sản phẩm cartesian của danh sách với nthời gian của chính nó .

Ví dụ, trong mã giả, chức năng của bạn có thể tương tự như:

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

Thí dụ:

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

Các hàm được xây dựng (hoặc các hàm từ các thư viện đã nhập) để tính toán sản phẩm (hoặc sức mạnh) của Cartesian không được phép do mã kết quả hơi nhàm chán.

Đầu vào và đầu ra nên được phân định nhưng có thể được thực hiện trong bất kỳ phương pháp hợp lý nào.

thứ tự đầu ra được đưa ra không quan trọng nhưng trùng lặp không được phép.

Đây là lần đầu tiên tôi đăng một câu hỏi, vì vậy nếu tôi làm bất cứ điều gì sai lầm khủng khiếp, xin vui lòng cho tôi biết.


5
Chào mừng đến với PPCG! Không có gì sai lầm khủng khiếp, nhưng hãy dành chút thời gian để xem bài đăng và câu trả lời này. Những điều cần tránh khi viết thử thách
JayCe

4
và để theo dõi quan điểm của @JayCe, bạn có thể (nên) đăng bài trong Hộp cát để nhận phản hồi trước khi đăng câu hỏi :-)
Giuseppe

@Giuseppe Ok, tôi sẽ làm điều đó từ bây giờ, cảm ơn :)
JoshM

1
Bản sao biên giới của codegolf.stackexchange.com/q/125104/194
Peter Taylor

1
Các bộ @Jakob sẽ ổn
JoshM

Câu trả lời:



6

Lisp thông thường , 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)))

Hãy thử trực tuyến!

vô dụng

(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
thông thường, chúng tôi khuyên bạn nên chờ đợi các bài nộp khác trước khi đăng một bài của riêng bạn :-)
Giuseppe

1
@Giuseppe Ok, cảm ơn vì lời khuyên :)
JoshM

1
bạn không cần phải có câu lệnh in trong bài nộp, vì một chức năng được cho phép
ASCII - chỉ

1
vì vậy: 96
ASCII - chỉ


6

R , 41 byte

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

Hãy thử trực tuyến!

combnchắc chắn không phải là một sản phẩm cartesian tích hợp, vì nó tính toán tất cả các kết nhợp đầu vào của nó.

R , 40 byte

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

Hãy thử trực tuyến!

expand.grid có lẽ là một sản phẩm cartesian tích hợp.


Có vẻ như thứ tự hoán vị trong bài nộp chính của bạn là sai.
Kirill L.

@KirillL. Có một lý do cụ thể thứ tự là quan trọng? Tôi giải thích thông số kỹ thuật đầu ra là đủ linh hoạt để cho phép chúng theo bất kỳ thứ tự nào.
Giuseppe

Có nhận xét của OP "đảm bảo đầu ra theo đúng thứ tự", tôi cho rằng "đúng" có nghĩa giống như trong ví dụ.
Kirill L.

@KirillL. Ah. Không thấy điều đó; Nó không có trong câu hỏi nên tôi không biết nó tồn tại! Tôi sẽ yêu cầu nó được đưa vào đó để làm rõ.
Giuseppe

4

Perl 6 , 16 byte

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

Thử nó

Hết hạn:

{  # 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}

Hãy thử trực tuyến!

{ }là một hàm với các đối số xy

#x chiều dài của x

y##xđộ dài của thời gian xlặp lạiy

!y##x tất cả các tuple chiều dài trên 0,1, ..., chiều dài (x) -1 dưới dạng ma trận chuyển vị

+ hoán vị

x@các yếu tố xtại các chỉ số đó


3

APL (Dyalog Classic) , 18 12 byte

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

Hãy thử trực tuyến!

-6 byte nhờ @ngn!


bạn có thể sử dụng với một đối số vectơ để tạo các chỉ mục và sau đó ⍺[ ]nhận các giá trị tương ứng
ngn

Tôi đã có một RANK ERRORkhi tôi cố gắng để làm điều đó.
Zacharý


cách bắt duy nhất là với = 1, trong trường hợp đó ⍳ trả về một vectơ đơn giản, không phải là vectơ của các vectơ có độ dài-1 lồng nhau như người ta mong đợi; đó là một trong những lỗi không bao giờ được sửa, vì lý do tương thích ngược
ngn



3

Ruby , 53 byte

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

Hãy thử trực tuyến!

Cách tiếp cận đệ quy, không quá ngắn, nhưng được đảm bảo không có bất kỳ tích hợp nào.

Thật hấp dẫn khi sử dụng các phương pháp hoán vị, nhưng điều này có lẽ không được tính và các tài liệu thực sự không khẳng định tính chính xác của trật tự, mặc dù dường như hoạt động trong thực tế:

Ruby , 35 byte

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

Hãy thử trực tuyến!



2

Vợt, 92 byte

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

Dùng thử trực tuyến

Ung dung

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

2

Thạch , 11 9 7 byte

³;þẎƊ’¡

Hãy thử trực tuyến!

Giải trình

³;þẎƊ’¡
³;þẎ    **Implements** the cartesian product of a value with the input
    Ɗ   Groups those together
     ’¡ Repeat (n-1) times

Nhìn vào bình luận của OP: p
Zacharý

Nhận xét của tôi mà tôi đã đưa ra là: "Tôi cũng cho rằng các nội dung cho toàn bộ thử thách cũng không được chấp nhận", vì vậy tôi chỉ cho rằng điều này là ổn.
Zacharý

Chà, hãy đợi OP sau đó
Zacharý

@ Zacharý xin lỗi, chức năng năng lượng của cartesian không được phép
JoshM

3
Tôi không biết, hai vòng lặp lồng nhau như thế về cơ bản là định nghĩa của một sản phẩm cartesian. Tôi không nói rằng bạn nên thay đổi nó, tôi chỉ nghĩ rằng việc cấm tích hợp trong thử thách này là không rõ ràng.
dyl Nam

2

Pure Bash (không có tiện ích bên ngoài), 57

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

Đầu vào được đưa ra dưới dạng tham số dòng lệnh; Thứ nhất là n, thứ 2 là danh sách được phân tách bằng dấu phẩy.

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

Hãy thử trực tuyến!


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

Dùng thử trực tuyến

Ung dung

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

Sự nhìn nhận

  • chuyển sang Java 10 nhờ Kevin Cruijssen

Nếu bạn sử dụng Java 10 thay vì 8, bạn có thể thay đổi ObjectListtrong các vòng lặp for-every thành var-4 byte. Ngoài ra, sau đó bạn có thể thay đổi Set<List>fthành List<List>fSet o=new HashSet();để var o=new Stack();có thêm -1 byte. Hãy thử trực tuyến.
Kevin Cruijssen

Hừm. sẽ loại bỏ các loại lambdas không còn hiệu lực
ASCII chỉ có

@ ASCII-chỉ Không, lambdas không được phép được cho phép. Tôi không thể sử dụng lambda ở đây vì giải pháp sử dụng đệ quy.
Jakob

@Jakob ah, đúng vậy> _>
ASCII chỉ

2

Oracle SQL, 177 byte

Tạo loại bộ sưu tập (31 byte):

CREATE TYPE t IS TABLE OF INT;

Sau đó sử dụng truy vấn (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

Giả sử rằng các tham số đầu vào nằm trong bảng icó các cột ab:

CREATE TABLE i (a t,b INT) NESTED TABLE a STORE AS t_a;
INSERT INTO i VALUES ( t(1,2,3), 3 );

Câu đố SQL

Kết quả :

|     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

Hãy thử trực tuyến! Tôi tìm thấy các chuỗi lặp lại và tham gia các danh sách bằng dấu phẩy rất khó thực hiện trong bash.


1

Javascript (Nút) , 75 byte

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

Hàm đệ quy đưa ra danh sách tới bàn điều khiển. Đâu alà một mảng trống và ilà 0 (không chắc chắn nếu điều này vẫn đủ điều kiện):

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

Hãy thử trực tuyến!


1
Tôi nghĩ bạn sẽ phải làm(m,n,a=[],i=0)=>
Artyer


1

J , 17 byte

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

Làm thế nào nó hoạt động?

Tôi liệt kê tất cả các nsố-số trong một hệ thống số với độ dài cơ sở của danh sách.

            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

Hãy thử trực tuyến!




Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.