สร้างผู้อนุญาต


9

สำหรับความท้าทายนี้คุณจะต้องสร้างฟังก์ชั่น (ฟังก์ชั่นของคุณอาจเป็นโปรแกรมที่สมบูรณ์) ที่รับรายการเป็นอินพุตและส่งกลับค่าการเรียงสับเปลี่ยนของรายการนั้น ฟังก์ชั่นของคุณจะต้องปฏิบัติตามข้อกำหนดดังต่อไปนี้

  • มันจะต้องกำหนดขึ้น

  • การเขียนฟังก์ชั่นของคุณด้วยตัวเองจำนวนครั้งของตัวแปรควรจะสามารถรับรายการจากการเรียงลำดับใด ๆ

นี่เป็นคำถามเกี่ยวกับรหัสกอล์ฟดังนั้นคำตอบจะได้คะแนนเป็นไบต์โดยไบต์น้อยจะดีขึ้น

กฎเพิ่มเติม

  • คุณอาจจะใช้วิธีใดรายการ ( [Integer], [String], [[Integer]]) ตราบใดที่มัน

    • ต้องไม่ว่างเปล่า
    • สามารถมีวัตถุที่แตกต่างอย่างน้อย 16 ค่าที่เป็นไปได้ (คุณไม่สามารถใช้ Haskell [()]และอ้างสิทธิ์การทำงานของคุณได้id)
    • สามารถมีวัตถุที่ซ้ำกัน (ไม่มีชุด)
  • คุณอาจเขียนโปรแกรมหรือฟังก์ชั่น แต่ต้องเชื่อฟังมาตรฐาน IO


แต่S_nเป็นวัฏจักรเท่านั้นสำหรับn<3
Nun Leaky

@LeakyNun มันไม่ได้ถามถึงการเปลี่ยนแปลงครั้งเดียวซึ่งสร้างกลุ่มที่สมมาตร: มันกำลังขอnext_permutationฟังก์ชั่น
Peter Taylor

มันพอเพียงที่จะเปลี่ยนแปลงรายการของ 0 และ 1 หรือไม่?
xnor

ฉันไม่แน่ใจว่าฉันเข้าใจประเด็นของข้อ จำกัด นี้ หากคุณอนุญาตรายการของ Booleans อะไรคือจุดที่ไม่อนุญาตให้ใช้ซ้ำได้ของสองรายการ
Dennis

@Dennis คุณทำดีจุด ฉันจะไม่อนุญาตรายการ booleans หรือประเภทที่มีค่าน้อยกว่า 16 ค่า
Ad Hoc Garf Hunter

คำตอบ:


4

CJam (11 ไบต์)

{_e!_@a#(=}

การสาธิตออนไลน์แสดงครบวงจรสำหรับรายการสี่องค์ประกอบที่มีองค์ประกอบที่ซ้ำกันหนึ่งรายการ

การผ่า

{      e# Define a block
  _e!  e#   Find all permutations of the input. Note that if there are duplicate
       e#   elements in the input then only distinct permutations are produced.
       e#   Note also that the permutations are always generated in lexicographic
       e#   order, so the order is independent of the input.
  _@a# e#   Find the index of the input in the list
  (=   e#   Decrement and get the corresponding element of the list
       e#   Incrementing would also have worked, but indexing by -1 feels less
       e#   wrong than indexing by the length, and makes this more portable to
       e#   GolfScript if it ever adds a "permutations" built-in
}

2

Mathematica + Combinatorica (แพ็คเกจในตัว) 34 Bytes

19 ไบต์เพื่อโหลดแพ็กเกจและ 15 สำหรับฟังก์ชัน

<<"Combinatorica`";NextPermutation

การใช้งาน:

%@{c, b, a}

หากไม่มีบิวท์อิน 61 ไบต์

Extract[s=Permutations[Sort@#],Mod[s~Position~#+1,Length@s]]&

Combinatorica นั้นน่าจะรวมอยู่ใน Mathematica อย่างสมบูรณ์ แต่ฉันคิดว่าฟังก์ชั่น NextPermutation ถูกมองข้ามไป



2

C ++, 42 ไบต์

#include <algorithm>
std::next_permutation

การดำเนินการที่แน่นอนนี้เป็นตัวใน C ++


2
ทำไมพื้นที่หลัง#include?
Yytsi

2

JavaScript (ES6), 145 139 137 134 108 ไบต์

บันทึกจำนวนมากถึง 25 ไบต์ด้วย @Neil!

รับอินพุตเป็นอาร์เรย์ของอักขระตัวอักษร ส่งคืนการเรียงลำดับครั้งถัดไปเป็นอาร์เรย์อื่น

a=>(t=x=y=-1,a.map((v,i)=>v<a[i+1]?(t=v,x=i):y=i>x&v>t?i:y),a[x]=a[y],a[y]=t,a.concat(a.splice(x+1).sort()))

อย่างไร?

นี่คือการสร้างตามลำดับพจนานุกรมที่ประมวลผล 4 ขั้นตอนต่อไปนี้ในแต่ละการวนซ้ำ:

  1. ค้นหาดัชนีที่ใหญ่ที่สุดXเช่น[X] <a [X + 1]

    a.map((v, i) => v < a[i + 1] ? (t = v, x = i) : ...)
  2. ค้นหาดัชนีที่ใหญ่ที่สุดYมากกว่าXเช่น[Y]> a [X]

    a.map((v, i) => v < a[i + 1] ? ... : y = i > x & v > t ? i : y)
  3. สลับค่าของ[X]กับของ[Y]

    a[x] = a[y], a[y] = t
  4. เรียงลำดับจาก[X + 1]จนถึงและรวมองค์ประกอบสุดท้ายตามลำดับพจนานุกรม

    a.concat(a.splice(x + 1).sort())

ตัวอย่าง:

ขั้นตอน

การสาธิต


คุณไม่สามารถเรียงลำดับแทนที่จะย้อนกลับได้ใช่ไหม นอกจากนี้ฉันคิดว่าv<a[i+1]&&(t=v,x=i)ประหยัดไบต์และคุณอาจประหยัดได้มากกว่าโดยใช้spliceสองsliceวินาที
Neil

@ นีลจับดี!
Arnauld

ฉันคิดว่าฉันก็สามารถที่จะรวมทั้งสองmaps เช่นกัน 112 ไบต์:a=>(t=x=y=-1,a.map((v,i)=>v<a[i+1]?(t=v,x=i):y=i>x&v>t?i:y),a[x]=a[y],a[y]=t,t=a.splice(++x).sort(),a.concat(t))
นีล

ฉันต้องยอมรับว่าฉันไม่คิดว่าa.concat(a.splice(++x).sort())จะไปทำงานเป็นอย่างอื่นฉันจะลอง ...
Neil

@ Neil ขอบคุณ! Updated (ด้วยการบันทึกอีก 4 ไบต์เพราะเราไม่จำเป็นต้องใช้t to concat () )
Arnauld

1

เยลลี่ 6 ไบต์

Œ¿’œ?Ṣ

วนรอบการเรียงสับเปลี่ยนตามลำดับพจนานุกรม

ลองออนไลน์!

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

Œ¿’œ?Ṣ  Main link. Argument: A (array)

Œ¿      Compute the permutation index n of A, i.e., the index of A in the
        lexicographically sorted list of permutations of A.
  ’     Decrement the index by 1, yielding n-1.
     Ṣ  Sort A.
   œ?   Getthe (n-1)-th permutation of sorted A.

1

C, 161 ไบต์

อัลกอริทึม O (n) จริง

#define S(x,y){t=x;x=y;y=t;}
P(a,n,i,j,t)int*a;{for(i=n;--i&&a[i-1]>a[i];);for(j=n;i&&a[--j]<=a[i-1];);if(i)S(a[i-1],a[j])for(j=0;j++<n-i>>1;)S(a[i+j-1],a[n-j])}

ตัวอย่างการใช้งาน:

int main(int argc, char** argv) {
    int i;
    int a[] = {1, 2, 3, 4};

    for (i = 0; i < 25; ++i) {
        printf("%d %d %d %d\n", a[0], a[1], a[2], a[3]);
        P(a, 4);
    }

    return 0;
}

1

Python 2 , 154 ไบต์

x=input()
try:exec'%s=max(k for k in range(%s,len(x))if x[%s-1]<x[k]);'*2%tuple('i1kjii');x[i-1],x[j]=x[j],x[i-1];x[i:]=x[:i-1:-1]
except:x.sort()
print x

ลองออนไลน์!


ฉันคิดว่านี่สั้นลงเพราะฟังก์ชั่นที่อนุญาตให้ใช้รายการแทน
orlp

ฉันลองมัน แต่execให้ข้อผิดพลาดทุกอย่างในฟังก์ชั่น
Dennis

0

เยลลี่ 10 ไบต์

ṢŒ!Q©i⁸‘ị®

ลองออนไลน์!

จัดเรียง> การเปลี่ยนแปลงทั้งหมด> ค้นหาอินพุต> เพิ่ม 1> ดัชนีลงใน "การเปลี่ยนแปลงทั้งหมด"


@PeterTaylor ฉันได้แก้ไขแล้ว
Leun Nun

มีบิลด์เฉพาะสำหรับการเรียงสับเปลี่ยน (เช่นคุณสามารถทำได้Œ¿‘œ?Ṣ) ฉันไม่ได้รู้สึกอยากขโมยตั้งแต่ยังไงก็ตาม
Erik the Outgolfer

@EriktheOutgolfer อาจจะยุ่งเล็กน้อยสำหรับอินพุตที่มีรายการซ้ำ
Leun Nun

อืม ... ฉันเดาว่าฉันมีรุ่นที่ใช้งานได้ก่อนหน้านี้ แต่ดูเหมือนว่าคุณจะใช้สิ่งQนี้ คุณยังสามารถเล่นกอล์ฟṢŒ!Qµi³‘ịได้ที่
Erik the Outgolfer


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