รายการคาร์ทีเซียนของรายการด้วยตัวเอง n ครั้ง


10

เมื่อได้รับรายชื่อ aa และค่าจำนวนเต็มบวกnรหัสของคุณควรเอาท์พุทผลิตภัณฑ์คาร์ทีเซียนของรายการด้วยnเวลาตัวเอง

ตัวอย่างเช่นใน pseudocode ฟังก์ชั่นของคุณอาจคล้ายกับ:

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

ตัวอย่าง:

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

ฟังก์ชั่นในตัว (หรือฟังก์ชั่นจากห้องสมุดที่นำเข้า) ที่ไม่ได้รับอนุญาตให้คำนวณผลิตภัณฑ์คาร์ทีเซียน (หรือกำลังไฟ) เนื่องจากรหัสที่ได้นั้นค่อนข้างน่าเบื่อ

อินพุตและเอาต์พุตควรคั่นด้วย แต่สามารถใช้วิธีการที่เหมาะสม

ลำดับการส่งออกที่ได้รับไม่สำคัญ แต่ไม่อนุญาตให้ทำซ้ำ

นี่เป็นครั้งแรกที่ฉันโพสต์คำถามดังนั้นถ้าฉันทำอะไรผิดพลาดอย่างมากโปรดบอกฉัน


5
ยินดีต้อนรับสู่ PPCG! ไม่มีอะไรผิดปกติอย่างน่ากลัว แต่ใช้เวลาในการดูโพสต์เมตาและคำตอบนี้ สิ่งที่ควรหลีกเลี่ยงเมื่อเขียนความท้าทาย
JayCe

4
และเพื่อติดตามประเด็นของ @JayCe คุณสามารถ (ควร) โพสต์ในThe Sandboxเพื่อรับข้อเสนอแนะก่อนโพสต์คำถาม :-)
Giuseppe

@Giuseppe ตกลงฉันจะทำต่อจากนี้ขอบคุณ :)
JoshM

1
ล่อคู่ของเส้นขอบ
Peter Taylor

1
ชุด @Jakob ควรจะปรับ
JoshM

คำตอบ:



6

Lisp สามัญ , 146 ไบต์

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

ลองออนไลน์!

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
โดยทั่วไปเราขอแนะนำให้รอการส่งอื่น ๆ ก่อนที่จะโพสต์หนึ่งใน :-) ของคุณเอง
Giuseppe

1
@Giuseppe ตกลงขอบคุณสำหรับคำแนะนำ :)
JoshM

1
คุณไม่จำเป็นต้องมีคำสั่งพิมพ์ในการส่งเนื่องจากฟังก์ชั่นที่ได้รับอนุญาต
ASCII- เท่านั้น



6

R , 41 ไบต์

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

ลองออนไลน์!

combnไม่ใช่ผลิตภัณฑ์คาร์ทีเซียนในตัวแน่นอนเนื่องจากเป็นการคำนวณการรวมกันทั้งหมดnของอินพุต

R , 40 ไบต์

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

ลองออนไลน์!

expand.grid อาจเป็นผลิตภัณฑ์คาร์ทีเซียนในตัว


ดูเหมือนว่าลำดับการเรียงสับเปลี่ยนในการส่งหลักของคุณนั้นผิด
Kirill L.

@KirillL มีเหตุผลพิเศษหรือไม่ที่คำสั่งซื้อมีความสำคัญ? ฉันตีความสเป็คเอาท์พุทว่ายืดหยุ่นพอที่จะยอมให้อยู่ในลำดับใดก็ได้
Giuseppe

มีความคิดเห็นของ OP "ให้แน่ใจว่าผลลัพธ์อยู่ในลำดับที่ถูกต้อง" ฉันสันนิษฐานว่า "ถูกต้อง" หมายความว่าเหมือนในตัวอย่าง
Kirill L.

@KirillL อา. ไม่เห็นว่า; มันไม่ได้อยู่ในเนื้อหาของคำถามดังนั้นฉันจึงไม่รู้ว่ามันมีอยู่จริง! ฉันจะถามว่าได้รับการชี้แจง
Giuseppe


3

K (ngn / k) , 10 ไบต์

{x@+!y##x}

ลองออนไลน์!

{ }เป็นฟังก์ชันที่มีอาร์กิวเมนต์xและy

#x ความยาวของ x

y##xความยาวของการxทำซ้ำyครั้ง

!y##x ความยาว - y ทั้งหมดจะเพิ่มมากกว่า 0,1, ... , ความยาว (x) -1 เป็นเมทริกซ์ที่ถูกย้าย

+ transpose

x@องค์ประกอบของxดัชนีเหล่านั้น


3

APL (Dyalog Classic) , 18 12 ไบต์

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

ลองออนไลน์!

-6 ไบต์ขอบคุณ @ngn!


คุณสามารถใช้กับอาร์กิวเมนต์เวกเตอร์เพื่อสร้างดัชนีแล้ว⍺[ ]รับค่าที่สอดคล้องกันได้
ngn

ฉันได้RANK ERRORเมื่อฉันพยายามทำ
Zacharý


สิ่งเดียวที่จับได้คือ⍵ = 1 ในกรณีนั้น⍳ส่งคืนเวกเตอร์ธรรมดาไม่ใช่เวกเตอร์ของเวกเตอร์ที่ซ้อนกันยาว -1 อย่างที่ใคร ๆ ก็คาดหวัง เป็นหนึ่งในข้อบกพร่องที่ไม่เคยได้รับการแก้ไขด้วยเหตุผลด้านความเข้ากันได้แบบย้อนหลัง
ngn



3

Ruby , 53 ไบต์

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

ลองออนไลน์!

วิธีการเรียกซ้ำไม่สั้นมาก แต่รับประกันว่าจะไม่มีบิวด์อินใด ๆ

มันล่อลวงให้ใช้วิธีการเรียงสับเปลี่ยน แต่สิ่งนี้อาจไม่นับและเอกสารจริง ๆ ไม่ได้รับประกันความถูกต้องของคำสั่งซื้อแม้ว่าจะดูเหมือนว่าจะใช้งานได้จริง:

Ruby , 35 ไบต์

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

ลองออนไลน์!




2

เจลลี่ , 11 9 7 ไบต์

³;þẎƊ’¡

ลองออนไลน์!

คำอธิบาย

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

ดูความคิดเห็นของ OP: p
Zacharý

ความคิดเห็นของฉันที่ฉันนำมาขึ้นคือ: "ฉันยังสมมติว่า buildins สำหรับความท้าทายทั้งหมดก็ถูกทำให้หมดกำลังใจ"
Zacharý

ทีนี้เรามารอ OP กันก่อนแล้ว
Zacharý

@ Zacharýขออภัยไม่อนุญาตให้ใช้ฟังก์ชันพลังงานคาร์ทีเซียน
JoshM

3
ฉันไม่รู้ว่าการซ้อนสองวงสำหรับลูปนั้นเป็นคำจำกัดความของผลิตภัณฑ์คาร์ทีเซียน ฉันไม่ได้บอกว่าคุณควรเปลี่ยนมัน แต่ฉันแค่คิดว่าการห้ามการใช้งานในตัวในการท้าทายนี้เป็นสิ่งที่ไม่ชัดเจน
dylnan

2

Pure Bash (ไม่มียูทิลิตี้ภายนอก), 57

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

อินพุตถูกกำหนดเป็นพารามิเตอร์บรรทัดคำสั่ง ที่ 1 คือที่n2 คือรายการที่คั่นด้วยเครื่องหมายจุลภาค

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

ลองออนไลน์!


2

Java 10, 19 + 135 = 154 ไบต์

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

ลองออนไลน์

Ungolfed

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

กิตติกรรมประกาศ

  • พอร์ตสู่ Java 10 ต้องขอบคุณ Kevin Cruijssen

หากคุณใช้ Java 10 แทน 8 คุณสามารถเปลี่ยนObjectและListสำหรับแต่ละลูปเป็นvar-4 ไบต์ นอกจากนี้แล้วคุณสามารถเปลี่ยนSet<List>fไปList<List>fและSet o=new HashSet();จะvar o=new Stack();เพิ่มอีก -1 ไบต์ ลองออนไลน์
Kevin Cruijssen

อืมมม กำลังออกจากประเภท lambdas ไม่สามารถใช้งานได้อีกต่อไป
ASCII เท่านั้น

@ ASCII-only ไม่อนุญาตให้แกะ lambdas ไม่ได้ ฉันไม่สามารถใช้แลมบ์ดาที่นี่เพราะวิธีแก้ปัญหาใช้การสอบถามซ้ำ
Jakob

@Jakob อ่าใช่แล้ว> _>
ASCII เท่านั้น

2

Oracle SQL, 177 ไบต์

สร้างประเภทคอลเลกชัน (31 ไบต์):

CREATE TYPE t IS TABLE OF INT;

จากนั้นใช้คิวรี (146 ไบต์):

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

สมมติว่าพารามิเตอร์อินพุตอยู่ในตารางที่iมีคอลัมน์aและb:

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

ซอ Fiddle

ผลลัพธ์ :

|     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

Javascript (Node) , 75 ไบต์

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

ฟังก์ชั่นวนซ้ำซึ่งส่งออกรายการไปยังคอนโซล aอาร์เรย์ว่างเปล่าอยู่ที่ไหนและiเป็น 0 (ไม่แน่ใจว่ายังคงมีสิทธิ์):

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

ลองออนไลน์!


1
ฉันคิดว่าคุณจะต้องทำ(m,n,a=[],i=0)=>
Artyer


1

J , 17 ไบต์

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

มันทำงานอย่างไร?

ฉันระบุnตัวเลข -digit ทั้งหมดในระบบตัวเลขที่มีความยาวพื้นฐานของรายการ

            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

ลองออนไลน์!




โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.