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


14

กำหนดลำดับความยาวของการผนวกท้ายnเพื่อเป็นการเรียงสับเปลี่ยนของตัวเลข1, 2, ..., nที่สามารถสร้างขึ้นได้โดยขั้นตอนต่อไปนี้:

  • 1เริ่มต้นด้วยหมายเลข

  • สำหรับหมายเลขจากแต่ละ2ที่จะnวางจำนวนนี้ไปยังจุดเริ่มต้นหรือจุดสิ้นสุดของลำดับ (ทั้งย่อหน้าหรือผนวกมันจึงชื่อของลำดับ)

ตัวอย่างเช่นนี่เป็นวิธีที่ถูกต้องในการสร้างลำดับ prepend-ผนวกท้ายความยาว 4:

1
21     [beginning]
213    [end]
2134   [end]

งานของคุณคือการสร้างโปรแกรมหรือฟังก์ชั่นที่จะนำตัวเลขnจาก3การ30เป็น input และพิมพ์หรือส่งคืนทั้งหมดลำดับย่อหน้า-ผนวกของความยาวnในการสั่งซื้อ lexicographical (ถ้าคุณ outputting สตริงและรายการไม่ได้ตัวเลขดังกล่าวข้างต้น 9 จะเป็นตัวแทน เป็นตัวอักษรa-uเพื่อรักษาความยาวสตริง) ตัวอย่างเช่นนี่คือลำดับสำหรับn = 4:

1234  [RRR]
2134  [LRR]
3124  [RLR]
3214  [LLR]
4123  [RRL]
4213  [LRL]
4312  [RLL]
4321  [LLL]

โดยทั่วไปมี 2 n-1nพีชคณิตย่อหน้า-ผนวกของความยาว

คุณไม่สามารถใช้ฟังก์ชั่นการเรียงลำดับในภาษาของคุณในรหัสของคุณ โปรแกรมที่สั้นที่สุดที่จะทำเช่นนี้ในภาษาใดก็ได้จะชนะ


a-uฉันไม่ได้เป็นแฟนของความต้องการรูปแบบการออกโดยเฉพาะอย่างยิ่งการแปลงตัวอักษร เราสามารถส่งออกรายการตัวเลขได้หรือไม่
xnor

3
คุณอาจต้องการรับคำตอบหลังจากผ่านไประยะหนึ่งเนื่องจากบางคนมักจะไม่ตอบคำถามหากมีคำตอบที่ยอมรับได้
เครื่องมือเพิ่มประสิทธิภาพ

1
ดังนั้นคุณมีคำตอบที่ยอมรับผิด ..
เครื่องมือเพิ่มประสิทธิภาพ

2
FryAmTheEggman โพสต์คำตอบของเขา 21 นาทีก่อนที่คุณจะแก้ไขของคุณ
Joe Z.

2
@Optimizer ฉันไม่คิดว่ามันเป็นวิธีที่แปลกที่สุด - คำตอบของ FryAmTheEggman คือ 19 ไบต์นาน 21 นาทีก่อนที่คุณจะเป็น นั่นเป็นคำตอบที่สั้นที่สุดที่โพสต์เร็วที่สุด
Joe Z.

คำตอบ:


10

CJam, 22 20 19 17 bytes

]]l~{)f+_1fm>|}/p

การขยายรหัส :

]]                   "Put [[]] onto stack. What we will do with this array of array is";
                     "that in each iteration below, we will first append the next";
                     "number to all present arrays, then copy all the arrays and";
                     "move the last element to first in the copy";
  l~                 "Read input number. Lets call it N";
    {         }/     "Run this code block N times ranging from 0 to N - 1";
     )f+             "Since the number on stack starts from 0, add 1 to it and append";
                     "it to all arrays in the array of array beginning with [[]]";
        _1fm>        "Copy the array of array and move last element from all arrays";
                     "to their beginning";
             |       "Take set union of the two arrays, thus joining them and eliminating";
                     "duplicates. Since we started with and empty array and started adding";
                     "numbers from 1 instead of 2, [1] would have appeared twice if we had";
                     "simply done a concat";
                p    "Print the array of arrays";

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

นี่คือรหัสการตรวจแก้จุดบกพร่องรุ่น:

]]l~ed{)edf+ed_ed1fm>ed|ed}/edp

มาดูกันว่ามันทำงานอย่างไรกับอินพุต3:

[[[]] 3]                                 "]]l~"            "Empty array of array and input";
[[[]] 1]                                 "{)"              "First iteration, increment 0";
[[[1]]]                                  "{)f+"            "Append it to all sub arrays";
[[[1]] [[1]]]                            "{)f+_"           "Copy the final array of array";
[[[1]] [[1]]]                            "{)f+_1fm>"       "shift last element of each";
                                                           "sub array to the beginning";
[[[1]]]                                  "{)f+_1fm>|}"     "Take set based union";
[[[1]] 2]                                "{)"              "2nd iteration. Repeat";
[[[1 2]]]                                "{)f+"
[[[1 2]] [[1 2]]]                        "{)f+_";
[[[1 2]] [[2 1]]]                        "{)f+_1fm>";
[[[1 2] [2 1]]]                          "{)f+_1fm>|}";
[[[1 2] [2 1]] 3]                        "{)";
[[[1 2 3] [2 1 3]]]                      "{)f+"
[[[1 2 3] [2 1 3]] [[1 2 3] [2 1 3]]]    "{)f+_";
[[[1 2 3] [2 1 3]] [[3 1 2] [3 2 1]]]    "{)f+_1fm>";
[[[1 2 3] [2 1 3] [3 1 2] [3 2 1]]]      "{)f+_1fm>|}";
[[[1 2 3] [2 1 3] [3 1 2] [3 2 1]]]      "{)f+_1fm>|}/";

ลองออนไลน์ได้ที่นี่


6

Haskell, 47 ไบต์

f 1=[[1]]
f n=(\x->map(++[n])x++map(n:)x)$f$n-1

1
การสลับไปยังรายการความเข้าใจช่วยประหยัดสองสามไบต์: f n=[[n:x,x++[n]]|x<-f$n-1]>>=id(โดยใช้ฟังก์ชั่นการต่อข้อมูลรหัสนักกอล์ฟ>>=id)
nimi

1
@nimi แต่มันผิดลำดับ
ภูมิใจ haskeller

@proudhaskeller: โอ้ที่รักไม่ได้อ่านสเป็คอย่างระมัดระวังพอ ฉันพยายามแก้ไขและพบสี่วิธีที่แตกต่างกันเล็กน้อยซึ่งมีความยาวเท่ากันกับเวอร์ชัน @ alephalpha ดังนั้นฉันจึงไม่สามารถปรับปรุงได้ f n=[x++[n]|x<-f$n-1]++[n:x|x<-f$n-1],f n=map(++[n])(f$n-1)++[n:x|x<-f$n-1] , f n=map(++[n])(f$n-1)++map(n:)(f$n-1),f n=(++[n])#n++(n:)#n;p#i=map p$f$i-1
Nimi

5

Python 2, 68

f=lambda n:[[1]]*(n<2)or[x*b+[n]+x*-b for b in[1,-1]for x in f(n-1)]

ส่งออกรายการของตัวเลข

โซลูชันแบบเรียกซ้ำ สำหรับการส่งออกn==1 [[1]]มิฉะนั้นให้เพิ่มnจุดเริ่มต้นหรือจุดสิ้นสุดของ(n-1)-permutations ทั้งหมด การเตรียมการทำให้การเรียงเปลี่ยนทางพจนานุกรมช้ากว่าการต่อท้ายดังนั้นการเรียงลำดับยังคงเรียงลำดับ

"บูลีน" bเข้ารหัสว่าจะใส่[n]ที่จุดเริ่มต้นหรือจุดสิ้นสุด ที่จริงแล้วเราย้ายรายการที่เหลือxx*b+[n]+x*-bในการแสดงออก การวางbเป็น-1หรือ1ให้ใช้การพลิกโดยการปฏิเสธเนื่องจากรายการที่คูณด้วย-1เป็นรายการว่าง


4

Pyth, 19

usCm,+dH+HdGr2hQ]]1

ลองออนไลน์ได้ที่นี่

นี่เป็นโปรแกรมเต็มรูปแบบที่รับอินพุตจาก stdin

สิ่งนี้ทำงานในลักษณะที่คล้ายคลึงกับโซลูชันของ xnor แต่สร้างค่าออกมาเล็กน้อยดังนั้นจึงต้องจัดลำดับใหม่ สิ่งที่เกิดขึ้นในแต่ละระดับคือแต่ละรายการของค่าก่อนหน้ามีค่าใหม่เพิ่มไปยังจุดสิ้นสุดและจุดเริ่มต้นและสิ่งเหล่านี้จะถูกห่อด้วย 2-tuple ซึ่งถูกรวมเข้าด้วยกันในรายการ ตัวอย่างเช่นขั้นตอนแรกทำสิ่งนี้:

[[1]]
[([1,2], [2,1])]

จากนั้นรายการของ tuples นี้จะถูกซิป (แล้วรวมเพื่อลบรายการด้านนอกสุด) ในกรณีแรกสิ่งนี้จะให้ค่าที่ไม่ได้แยกจากด้านบนเนื่องจากมีเพียงค่าเดียวในรายการ

ขั้นตอนที่แสดง 2-> 3:

([1,2], [2,1])
[([1,2,3],[3,1,2]),([2,1,3],[3,2,1])]
([1,2,3],[2,1,3],[3,1,2],[3,2,1])

2

Mathematica, 57 54 49 ไบต์

f@1={{1}};f@n_:=#@n/@f[n-1]&/@Append~Join~Prepend

ตัวอย่าง:

f[4]

{{1, 2, 3, 4}, {2, 1, 3, 4}, {3, 1, 2, 4}, {3, 2, 1, 4}, {4, 1, 2, 3} , {4, 2, 1, 3}, {4, 3, 1, 2}, {4, 3, 2, 1}}


2

J, 26 ไบต์

   0|:<:((,,.,~)1+#)@[&0,.@1:

   (0|:<:((,,.,~)1+#)@[&0,.@1:) 3
1 2 3
2 1 3
3 1 2
3 2 1

1 ไบต์ปรับปรุงขอบคุณที่FUZxxl


ทดแทน,.สำหรับ,"1หนึ่งตัวละคร
FUZxxl

1

Pyth, 34 33 วันที่ 31 29

โดยทั่วไปคำแปลของXNOR 's คำตอบหลาม ฉันยังไม่เก่งกับ Pyth ดังนั้นจึงยินดีรับข้อเสนอแนะในการปรับปรุง

กำหนดฟังก์ชั่นyเพื่อกลับรายการของรายการจำนวนเต็ม

L?]]1<b2smm++*kdb*k_dy-b1,1_1

ปรับปรุง:บันทึกไว้ 2 ไบต์ขอบคุณที่FryAmTheEggman

คำอธิบาย:

L                                  define a function y with argument b that returns
 ?*]]1<b2                          [[1]] if b < 2 else
         s                         sum(
          m                        map(lambda d:
           m                       map(lambda k:
            ++*kdb*k_d             k*d + [b] + k*-d
                      y-b1         , y(b - 1))
                          ,1_1)    , (1, -1))

บางอย่างของ pyth: -b1สามารถtb, [1_1)เป็นได้,1_1(แต่คุณสามารถวางวงเล็บปิดได้เนื่องจากคุณเพียงแค่ต้องนับจำนวนไบต์ที่จำเป็นในการทำให้ฟังก์ชั่นแม้ว่าคุณจะไม่สามารถเรียกมันได้โดยไม่ต้องปิดมัน) และคุณ ไม่จำเป็นต้องห่อbในรายการเนื่องจาก pyth จะแปลงเป็นรายการโดยอัตโนมัติเมื่อเพิ่มรายการลงใน int
FryAmTheEggman

[1,-1]ฉันมาด้วยวิธีการประหยัดหลายไบต์โดยการทำแผนที่ที่สองมากกว่า ฉันสามารถบันทึกไบต์เพื่อ hardcode สิ่งที่สั้นโดยเฉพาะอย่างยิ่งเมื่อคุณลดความซับซ้อนของตรรกะ ฉันได้รับL?]]1<b2sCm,+db+bdytb
FryAmTheEggman

@FryAmTheEggman คุณอาจต้องการเพิ่มคำตอบของคุณเอง มันยอดเยี่ยมมาก
PurkkaKoodari

ตกลงฉันต้องการพยายามเอาชนะ CJam ก่อนโพสต์ แต่ฉันคิดว่าเคล็ดลับการซิปนั้นน่าสนใจพอที่จะทำบุญโพสต์ได้ ขอให้โชคดีกับ
Pyth


1

JavaScript (ES6) 73 80

การติดตั้ง JavaScript ของโซลูชันที่ดีของ @ Optimizer

แบบเรียกซ้ำ (73):

R=(n,i=1,r=[[1]])=>++i>n?r:r.map(e=>r.push([i,...e])+e.push(i))&&R(n,i,r)

ซ้ำ (74):

F=n=>(i=>{for(r=[[1]];++i<=n;)r.map(e=>r.push([i,...e])+e.push(i))})(1)||r

ทดสอบในคอนโซล Firefox / FireBug

R(4)

[[1, 2, 3, 4], [2, 1, 3, 4], [3, 1, 2, 4], [3, 2, 1, 4], [4, 1, 2, 3] , [4, 2, 1, 3], [4, 3, 1, 2], [4, 3, 2, 1]


0

โซลูชัน Java ของฉัน:

public static void main(String[] args) {
    listPrependAppend(4);
}

private static void listPrependAppend(int n) {
    int total = (int) Math.pow(2, n - 1);
    int ps;
    boolean append;
    String sequence;
    String pattern;

    for (int num = 0; num < total; num++) {
        sequence = "";
        pattern = "";
        append = false;
        ps = num;
        for (int pos = 1; pos < n + 1; pos++) {
            sequence = append ? (pos + sequence) : (sequence + pos);
            append = (ps & 0x01) == 0x01;
            ps = ps >> 1;
            if (pos < n) {
                pattern += append ? "L" : "R";
            }
        }
        System.out.format("%s\t[%s]%n", sequence, pattern);
    }
}

โอ้ตอนนี้หลังจากที่ได้เห็นคำตอบอื่น ๆ ฉันเห็นสิ่งที่คุณหมายถึงเกี่ยวกับคำตอบที่สั้นที่สุด
Brett Ryan

2
ในขณะที่วิธีการแก้ปัญหาของคุณมีความน่าเชื่อถือกระชับและได้รับการเสนออย่างถูกต้องในแบบของคุณเองคุณถูกต้องแล้วว่าไม่ใช่ปัญหาสำหรับผู้สมัคร
Joe Z.

1
@BrettRyan คุณสามารถทำให้โค้ดของคุณสั้นลงโดยการลบช่องว่างที่ไม่จำเป็นออกและใช้ชื่อตัวแปรแบบอักขระเดียว นอกจากนี้คุณยังสามารถเปลี่ยนจากสิ่งที่ชอบfalse 5<4
ProgramFOX

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