สร้างการรวมกันทั้งหมดของรายการองค์ประกอบที่กำหนดเรียงลำดับ


13

สร้างรหัสที่รับรายการและตัวเลขเป็นอินพุตและสร้างชุดค่าผสมที่เป็นไปได้ทั้งหมดด้วยความยาวของตัวเลข ตัวอย่างเช่นด้วยรายการ{0,1}และหมายเลข2 :

00
01
10
11

โปรแกรมของคุณไม่จำเป็นต้องคาดหวังว่าอักขระสองครั้งหรือมากกว่านั้นในรายการเช่น {0,0,0,0,0,1,1,1,5,5}

ตรวจสอบให้แน่ใจว่าคุณพิมพ์ชุดค่าผสมที่เรียงลำดับตามรายการ:

ด้วยรายการ{0,1}และหมายเลข5 (สร้างโดยรหัสบางส่วนของฉันซึ่งยาวเกินไปที่จะชนะ)

00000
00001
00010
00011
00100
00101
00110
00111
01000
01001
01010
01011
01100
01101
01110
01111
10000
10001
10010
10011
10100
10101
10110
10111
11000
11001
11010
11011
11100
11101
11110
11111

แต่ด้วยรายการ{1,0}และหมายเลข2 :

11
10
01
00

อย่างที่คุณเห็นรายการกลับรายการหมายถึงคำสั่งกลับรายการ

ลองดูโครงสร้างมันเหมือนต้นไม้

นี่คือโค้ดกอล์ฟดังนั้นโค้ดที่สั้นที่สุดในหน่วยไบต์ชนะ!


3
ฉันคิดว่าสิ่งนี้จะซ้ำกัน แต่ฉันหาไม่พบ
Luis Mendo

1
การเรียงลำดับทำงานอย่างไรถ้ารายการอินพุตไม่ถูกเรียงลำดับ?
JAD

@ Jarko ฉันจะถือว่า tuples ของดัชนีของอินพุทเรียงลำดับในผลลัพธ์
Luis Mendo

1
@brad คำตอบเริ่มต้นคือใช่เว้นแต่ OP จะพูดอย่างอื่น
Stewie Griffin

3
ฉันไม่เข้าใจ ... การใช้ชื่อตัวเองเป็นชื่อผู้ใช้มีอะไรผิดปกติ
Stewie Griffin

คำตอบ:


16

เยลลี่ 1 ไบต์

TryItOnline

อะตอมของคาร์ทีเซียนในตัวเป็นลิงก์ dyadic ด้วยอาร์กิวเมนต์ซ้ายรายการและอาร์กิวเมนต์ที่ถูกต้องนับหรือเป็นโปรแกรมเต็มรูปแบบที่มีอาร์กิวเมนต์แรกรายการและอาร์กิวเมนต์ที่สองนับ


1
หนึ่งไบต์! นั่นแก้ไขได้!
LMD

4
คุณรู้อะไรฉันจะส่งคำตอบแบบศูนย์ ZERO! ใน JAVA! คุณชอบแบบนั้นเหรอ? :) (อย่างจริงจังแม้ว่าการเล่นกอล์ฟที่ดี)
OldBunny2800

9

Haskell, 20 ไบต์

(mapM id.).replicate

exaple การใช้งาน:

*Main> ( (mapM id.).replicate )  2 "01" 
["00","01","10","11"]
*Main> ( (mapM id.).replicate )  2 "10" 
["11","10","01","00"]

replicateทำnสำเนาของพารามิเตอร์ที่ 2 และmapM idสร้างชุดค่าผสม Btw mapM idเป็นเช่นเดียวกับsequenceแต่น้อยกว่า 1 ไบต์



6

Pyth, 2 ไบต์

^F

โปรแกรมที่รับอินพุตในแบบฟอร์มlist,numberและพิมพ์รายการของรายการ

ชุดทดสอบ

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

^F   Program. Input: Q
^FQ  Implicit input fill
 F   Fold
^    repeated Cartesian power
  Q  over Q
     Implicitly print

ดูเหมือนว่าจะแก้ปัญหาได้ แต่อาจมีคนอื่นสามารถทำได้ด้วยไบต์เดียว
LMD

ใช่คนอื่นชนะ (วุ้นหนึ่งไบต์) แต่วิธีแก้ปัญหาที่ดีอยู่แล้ว
LMD

6

Perl 6 , 15 ไบต์

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

คำอธิบาย:

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

{             } # bare block lambda

     @^a        # declare first parameter as Positional
           $^b  # declare second parameter
         xx     # list repeat 「@a」, 「$b」 times

# at this point given 「 (0,1), 5 」
# ((0 1) (0 1) (0 1) (0 1) (0 1))

 [ ]            # list reduce
  X             #    using cross meta-operator

# results in a list of lists
# ((0 0 0 0 0)
#  (0 0 0 0 1)
#  (0 0 0 1 0)
#  (0 0 0 1 1)
#  (0 0 1 0 0)
#  (0 0 1 0 1)
#  ...
#  (1 1 1 1 1))
say {[X] $^a xx$^b}( (0,1), 2 ); # ((0 0) (0 1) (1 0) (1 1))
say {[X] $^a xx$^b}( (1,0), 2 ); # ((1 1) (1 0) (0 1) (0 0))
say {[X] $^a xx$^b}( (0,1,2), 2 );
# ((0 0) (0 1) (0 2) (1 0) (1 1) (1 2) (2 0) (2 1) (2 2))

put {[X] $^a xx$^b}( (0,1), 5 )».join;
# 00000 00001 00010 00011 00100 00101 00110 00111 01000 01001 01010 01011 01100 01101 01110 01111 10000 10001 10010 10011 10100 10101 10110 10111 11000 11001 11010 11011 11100 11101 11110 11111

ถ้าพวกเขาเคยอัพเกรดที่จะปล่อยของRakudoจากหลังจากที่ปล่อยอย่างเป็นทางการของPerl 6คุณจะสามารถที่จะทำงานนี้ที่Ideone
Brad Gilbert b2gills

5

JavaScript (Firefox 30+), 55 ไบต์

f=(a,n)=>n?[for(b of a)for(c of f(a,n-1))[b,...c]]:[[]]

ฉันมีการเรียกซ้ำ 99% เป็นวิธีที่ดีที่สุดในการใช้ JavaScript


4

Perl, 30 ไบต์

28 ไบต์ของรหัสเมือง + -nlธง

$"=",";say for glob"{@F}"x<>

วิธีเรียกใช้:

perl -alE '$"=",";say for glob"{@F}"x<>' <<< "1 0
2"

ฉันคิดว่าการป้อนข้อมูลเป็นรายการตัวเลขนั้นมีเหตุผลสำหรับ Perl อย่างไรก็ตามหากเราอนุญาตให้จินตนาการและใส่ข้อมูลด้วยวงเล็บและเครื่องหมายจุลภาค (ดังที่แสดงในคำถาม) เราสามารถลงไปที่20 ไบต์ :

perl -nlE 'say for glob$_ x<>' <<< "{1,0}
2"

คำอธิบาย: globวัตถุประสงค์เริ่มต้นใน Perl คือรายการและวนซ้ำผ่านชื่อไฟล์ แต่เมื่ออาร์กิวเมนต์มีวงเล็บปีกกามันจะสร้างชุดค่าผสมที่เกิดขึ้นจากองค์ประกอบหนึ่งของแต่ละกลุ่มวงเล็บ
-aautosplit บนช่องว่างอินพุตและวางผลลัพธ์ไว้ใน@Fอาร์เรย์
$"เป็นตัวคั่นรายการ: เป็นตัวคั่นที่แทรกระหว่างองค์ประกอบของรายการภายในสตริง เราตั้งค่าเป็น,ดังนั้น"{@F"}สร้าง{.,.}(ถ้า@Fมี 0 และ 1)
จากนั้นxเป็นตัวดำเนินการสตริงซ้ำ (และ<>รับหนึ่งบรรทัดอินพุต)
และสุดท้ายทำsay forซ้ำผ่านรายการที่สร้างโดยglobและพิมพ์องค์ประกอบ


4

Mathematica ขนาด 6 ไบต์

Tuples

ยังแย่กว่า Jelly :(

การใช้

Tuples[{0, 1}, 5]

{{0, 0, 0, 0, 0}, {0, 0, 0, 0, 1}, {0, 0, 0, 1, 0}, {0, 0, 0, 1, 1}, {0, 0, 1, 0, 0}, {0, 0, 1, 0, 1}, {0, 0, 1, 1, 0}, {0, 0, 1, 1, 1}, {0, 1, 0, 0, 0}, {0, 1, 0, 0, 1}, {0, 1, 0, 1, 0}, {0, 1, 0, 1, 1}, {0, 1, 1, 0, 0}, {0, 1, 1, 0, 1}, {0, 1, 1, 1, 0}, {0, 1, 1, 1, 1}, {1, 0, 0, 0, 0}, {1, 0, 0, 0, 1}, {1, 0, 0, 1, 0}, {1, 0, 0, 1, 1}, {1, 0, 1, 0, 0}, {1, 0, 1, 0, 1}, {1, 0, 1, 1, 0}, {1, 0, 1, 1, 1}, {1, 1, 0, 0, 0}, {1, 1, 0, 0, 1}, {1, 1, 0, 1, 0}, {1, 1, 0, 1, 1}, {1, 1, 1, 0, 0}, {1, 1, 1, 0, 1}, {1, 1, 1, 1, 0}, {1, 1, 1, 1, 1}}


3

Python ขนาด 57 ไบต์

from itertools import*
lambda o,n:list(product(*([o]*n)))

repl.it

ฟังก์ชั่นที่ไม่ได้ตั้งชื่อใช้รายการของวัตถุoและการนับnและส่งคืนรายการของชุดค่าผสม


3

Pure Bash, 36

printf -vv %$2s
eval echo ${v// /$1}

ป้อนข้อมูลโดยใช้พารามิเตอร์บรรทัดคำสั่ง - รายการนี้เป็นรายการที่คั่นด้วยเครื่องหมายจุลภาคในวงเล็บปีกกาเช่น:

./elemcombo.sh "{0,1}" 2

หมายเหตุรายการอินพุตจะต้องมีการยกมาดังนั้นเชลล์การโทรไม่ขยายเร็วเกินไป

ไอดีโอ


ดูเหมือนจะใช้งานไม่ได้
Ipor Sircer

เพียงป้อนข้อมูลซ้ำ n ครั้งเท่านั้นไม่พิมพ์ชุดค่าผสมที่เป็นไปได้ทั้งหมด
Ipor Sircer

@IporSircer ฉันชี้แจงรูปแบบการป้อนที่ต้องการ ตอนนี้ใช้ได้ผลสำหรับคุณหรือไม่
Digital Trauma

bash a.sh "{0,1}" 2-> {0,1}{0,1}(เวอร์ชัน 4.4.5 (1) -release)
Ipor Sircer

1
@IporSircer ดูเหมือนว่า TIO อาจใส่ args ลงใน execve () หรือการโทรที่คล้ายกัน อัญประกาศจำเป็นเฉพาะเมื่อสคริปต์ถูกเรียกจากเชลล์อื่นเพื่อป้องกันเชลล์การเรียกไม่ให้ทำการขยายตัวของวงเล็บปีกกา ในกรณีของ TIO รายการไม่ต้องการราคา tio.run/nexus/…
Digital Trauma

3

R , 53 45 ไบต์

function(x,n)rev(expand.grid(rep(list(x),n)))

ลองออนไลน์!

rev มีการปฏิบัติตามคำสั่งการเรียงลำดับที่ต้องการอย่างแม่นยำหรือไม่ซึ่งดูเหมือนจะไม่สำคัญสำหรับปัญหานี้และเพิ่ม 5 ไบต์


เพียงแค่revสำหรับ45 ไบต์ :)
Jayce

มีเมทริกซ์ในใจและลืมผลลัพธ์ที่ได้คือรายการ (กรอบข้อมูล)
ngm

1

แร็กเก็ต 123 ไบต์

(let p((s "")(l(map number->string(sort l <))))
(if(= n(string-length s))(displayln s)(for((i l))(p(string-append s i)l))))

Ungolfed:

(define(f l n)
  (let loop ((s "")
             (l (map number->string (sort l <))))
    (if (= n (string-length s))
        (displayln s)
        (for ((i l))
          (loop (string-append s i) l)))))

การทดสอบ:

(f '(0 1) 2)
(f '(0 1) 3)
(f '(0 1) 5)

เอาท์พุท:

00
01
10
11

000
001
010
011
100
101
110
111

00000
00001
00010
00011
00100
00101
00110
00111
01000
01001
01010
01011
01100
01101
01110
01111
10000
10001
10010
10011
10100
10101
10110
10111
11000
11001
11010
11011
11100
11101
11110
11111

1

PHP, 109 ไบต์

for($o=$a=array_slice($argv,2);--$argv[1];$o=$c,$c=[])foreach($a as$n)foreach($o as$s)$c[]=$n.$s;print_r($o);

รับความยาวเป็นอาร์กิวเมนต์แรกและรายการเป็นอาร์กิวเมนต์เพิ่มเติม
ใช้เช่น:

php -r "for($o=$a=array_slice($argv,2);--$argv[1];$o=$c,$c=[])foreach($a as$n)foreach($o as$s)$c[]=$n.$s;print_r($o);" 5 0 1

จะพบข้อผิดพลาดร้ายแรง "หมดหน่วยความจำ" หากถูกขอให้มีความยาว 0


คุณไม่ต้องจัดการกับความยาว 0
LMD

1

05AB1E , 2 1 ไบต์s

ã

-1 ขอบคุณไบต์@Enigma

ลองออนไลน์

อินพุตเป็นnumber\nlistเอาต์พุตเป็นรายการของรายการ

คำอธิบาย:

     # Implicit input `a`, `b`
ã    # Take the Cartesian product of list `b` repeated `a` times

1
คุณไม่ต้องการที่Iนี่
Emigna

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