ดัชนีการเปลี่ยนแปลงของผกผัน


17

บทนำ

พีชคณิตเรียงลำดับของรายการที่มีองค์ประกอบnสามารถกำหนดหมายเลขได้ตั้งแต่ 0 ถึงn ! - 1. ตัวอย่างเช่น 3! = 6 พีชคณิต(1,2,3)จะ(1,2,3), (1,3,2), (2,1,3), (2,3,1), ,(3,1,2)(3,2,1)

เมื่อการเรียงสับเปลี่ยนถูกนำไปใช้กับรายการองค์ประกอบของมันจะเรียงลำดับตามลำดับเดียวกับตัวเลขในการเรียงลำดับ ยกตัวอย่างเช่นการใช้การเปลี่ยนลําดับ(2,3,1)การอัตราผลตอบแทนl = (a,b,c)(l[2],l[3],l[1]) = (b,c,a)

อินเวอร์สของการเปลี่ยนแปลงนั้นหมายถึงการเรียงสับเปลี่ยนที่ย้อนกลับการดำเนินการนี้คือการใช้การเปลี่ยนแปลงและจากนั้นอินเวอร์สของมัน (หรือกลับกัน) ไม่ได้ปรับเปลี่ยนอาร์เรย์ ยกตัวอย่างเช่นค่าผกผันของการ(2,3,1)เป็น(3,1,2)ตั้งแต่การใช้ที่อัตราผลตอบแทน(b,c,a)(a,b,c)

นอกจากนี้การเปลี่ยนแปลงผกผันของนำไปใช้กับการเปลี่ยนแปลงของตัวเองผลตอบแทนถัวเฉลี่ยเลข 1 ... n ยกตัวอย่างเช่นการใช้(3,1,2)เพื่อให้อัตราผลตอบแทน(2,3,1)(1,2,3)

ตอนนี้เรากำหนดฟังก์ชั่นrevind ( x ) เป็นดัชนีของการเปลี่ยนแปลงผกผันของการเปลี่ยนแปลงที่มีดัชนีx (นี่คือA056019หากคุณสนใจ)

เนื่องจากการเรียงสับเปลี่ยนกับดัชนีฉันเพียงแก้ไขรายการสุดท้ายkของรายการiff 0 ≤ i < k !,เราสามารถเพิ่มองค์ประกอบจำนวนใด ๆ ไปยังจุดเริ่มต้นของรายการโดยไม่มีผลต่อrevind ( i ) ดังนั้นความยาวของรายการจึงไม่มีผลต่อผลลัพธ์

ท้าทาย

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

อินพุตและเอาต์พุตอาจเป็นดัชนี 0 หรือดัชนี 1 แต่จะต้องสอดคล้องกันระหว่างพวกเขา

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

ใช้กฎมาตรฐานของ

ตัวอย่าง

ตัวอย่างด้านล่างเป็นดัชนี 0

Input    Output
0        0
1        1
2        2
3        4
4        3
5        5
6        6
13       10
42       51
100      41
1000     3628
2000     3974
10000    30593
100000   303016

การใช้งานอ้างอิง (Python 3)

def revind(n):
    from math import factorial
    from itertools import permutations, count
    l = next(filter(lambda x: factorial(x) > n, count(1)))
    pms = list(permutations(range(l)))
    return [k for k in range(len(pms)) if tuple(pms[n][i] for i in pms[k]) == pms[0]][0]


1
ฉันต้องค้นหาคำจำกัดความของการเรียงสับเปลี่ยนผกผันเพื่อทำความเข้าใจกับความท้าทายนี้ ฉันพบตัวอย่างของคุณ(a,b,c)อย่างชัดเจน โปรดระบุคำอธิบายที่ถูกต้องว่าการเปลี่ยนรูปแบบอินเวอร์สคืออะไร
ทำให้เสียชีวิต

@ สรุปสิ่งนี้เป็นเรื่องยากที่จะอธิบายง่ายๆ ดีขึ้นแล้ว?
PurkkaKoodari

เจลลี่มีอะตอม(เกรดขึ้น) ซึ่งเรียงลำดับดัชนีของอาร์เรย์ตามค่าที่สอดคล้องกัน สิ่งนี้เกิดขึ้นเมื่อเปลี่ยนการเรียงสับเปลี่ยนของ1, …, nแต่มันไม่ได้ผลสำหรับการเรียงสับเปลี่ยนอื่น ๆ เป็นที่ต้องห้ามในตัว?
Dennis

@Dennis คำถามยาก ในทางเทคนิคแล้วมันจะพบการผกผันของการเปลี่ยนแปลงใด ๆ หลังจากที่มันถูกนำไปใช้กับรายการที่เพิ่มขึ้นอย่างเข้มงวด ดังนั้นฉันจะบอกว่าไม่ได้รับอนุญาต (ถ้าใครบางคนไม่เห็นด้วยอย่างจริงจังรู้สึกอิสระที่จะแสดงความคิดเห็นฉันอาจเปลี่ยนแปลงได้ถ้าชุมชนปรารถนาอย่างยิ่ง)
PurkkaKoodari

คำตอบ:


5

เยลลี่ 6 ไบต์

ịŒ!⁺iR

I / O ใช้การจัดทำดัชนีแบบ 1 ช้ามากและหิวความจำ

การตรวจสอบ

ตราบใดที่อินพุตไม่เกิน8! = 40320ก็จะเพียงพอที่จะพิจารณาพีชคณิตทั้งหมดของอาร์เรย์[1, ... , 8] สำหรับกรณีทดสอบครั้งสุดท้ายจำนวนพีชคณิตของ[1, …, 9]เพียงพอ

ด้วยรหัสที่แก้ไขเล็กน้อยซึ่งพิจารณาการเปลี่ยนลำดับของเลขจำนวนเต็มบวก8หรือ9ตัวแรกคุณสามารถลองออนไลน์ได้! หรือตรวจสอบกรณีทดสอบที่เหลือทั้งหมด

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

ịŒ!⁺iR  Main link. Argument: n

 Œ!     Yield all permutations of [1, ..., n].
ị       At-index; retrieve the n-th permutation.
   ⁺    Duplicate the Œ! atom, generating all permutations of the n-th permutation.
     R  Range; yield [1, ..., n].
    i   Index; find the index of [1, ..., n] in the generated 2D array.

วิธีอื่น 6 ไบต์ (ไม่ถูกต้อง)

Œ!Ụ€Ụi

มันใช้เวลานานและใช้อะตอมที่ต้องห้ามเกรดขึ้นมาแต่มันก็มีสำนวนมากกว่า

โดยการเพิ่ม8 (หรือ9สำหรับกรณีทดสอบครั้งสุดท้าย) เราสามารถลองออนไลน์ได้!

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

Œ!Ụ€Ụi  Main link. Argument: n

Œ!      Yield all permutations of [1, ..., n].
  Ụ€    Grade up each; sort the indices of each permutation by the corresponding
        values. For a permutation of [1, ..., n], this inverts the permutation.
    Ụ   Grade up; sort [1, ..., n!] by the corresponding inverted permutations
        (lexicographical order).
     i  Index; yield the 1-based index of n, which corresponds to the inverse of
        the n-th permutation.

6

Mathematica, 74 ไบต์

Max@k[i,Flatten@Outer[i=Permutations[j=Range@#];k=Position,{i[[#]]},j,1]]&

ใช้การจัดทำดัชนี 1 รายการ ไม่มีประสิทธิภาพมาก (ใช้หน่วยความจำ ~ 11GB เมื่อมีการป้อนข้อมูล11)

คำอธิบาย

j=Range@#

สร้างรายการจาก 1 ถึง N. jร้านว่าใน

i=Permutations[...]

jค้นหาพีชคณิตทั้งหมดของ iเก็บไว้ในที่

k=Position

เก็บฟังก์ชั่นในPosition k(เพื่อลดจำนวนไบต์เมื่อใช้Positionอีกครั้ง)

Flatten@Outer[...,{i[[#]]},j,1]

ค้นหาการเรียงสับเปลี่ยนของการเรียงสับเปลี่ยน N-th

Max@k[i,...]

ค้นหาk( Position) ของการเปลี่ยนแปลงการผกผันในi(การเปลี่ยนลำดับทั้งหมด)

ใช้บิวด์อิน46 43 ไบต์

a[(a=Ordering)/@Permutations@Range@#][[#]]&

1 การจัดทำดัชนี


2
"Builtins ที่ ... ค้นหาการเปลี่ยนแปลงการผกผันถูกแบน"
Greg Martin

@ GregMartin อ่าฉันพลาดส่วนนั้นไปและเห็นเพียงส่วน "คืนดัชนีการเปลี่ยนแปลง" โง่ฉัน ... รหัสใหม่ไม่มีปัญหานั้น
JungHwan Min

อ๋อฉันเห็นด้วยว่ามันง่ายที่จะพลาด 74 ไบต์ - ยังค่อนข้างน่าประทับใจ!
เกร็กมาร์ติน

5

MATL , 15 ไบต์

:Y@tGY)Z)G:=!Af

อินพุตและเอาต์พุตเป็นพื้นฐาน 1

คล้ายกับคำตอบ CJam ของ @ MartinEnderแต่พบว่าการเรียงสับเปลี่ยนผกผันโดยการเรียงลำดับการเรียงสับเปลี่ยนที่เป็นไปได้ทั้งหมดตามที่มีการระบุโดยอินพุต

มันมีหน่วยความจำ10ไม่เพียงพอในคอมไพเลอร์ออนไลน์สำหรับอินพุต

ลองออนไลน์!

คำอธิบาย

:      % Implicitly input N. Push range [1 2 ... N]
Y@     % Matrix witll all permutations of size N. Each permutation is a row
tGY)   % Duplicate. Get the N-th row
Z)     % Use that as a column index into the matrix of all permutations
G:=    % Compare each row with [1 2 ... N]
!Af    % Find index of the row that matches. Implicitly display

5

Pyth, 12 ไบต์

xJ.phQxL@JQh

ชุดทดสอบ

0 จัดทำดัชนีแล้ว

คำอธิบาย:

xJ.phQxL@JQh
xJ.phQxL@JQhQ    Implicit variable introduction
                 Q = eval(input())
  .phQ           Form all permutations of range(Q+1), namely [0, 1, .. Q]
 J               Save to J.
        @JQ      Take the Qth element of J.
      xL   hQ    Map all elements of [0, 1, ..., Q] to their index in above
x                Find the index in J of the above.

5

05AB1E , 14 13 ไบต์

หน่วยความจำไม่มีประสิทธิภาพมาก ตอนนี้หน่วยความจำไม่มีประสิทธิภาพมากขึ้น (แต่สั้นกว่า 1 ไบต์)
ช่วง 0
ใช้การเข้ารหัสCP-1252

ƒ¹ÝœD¹èNkˆ}¯k

ลองออนไลน์! หรือเป็นชุดทดสอบดัดแปลง

คำอธิบาย

ƒ               # for N in range[0 .. x]
 ¹ÝœD           # generate 2 copies of all permutations of range[0 .. x]
     ¹è         # get permutation at index x
       Nkˆ      # store index of N in that permutation in global list
         }      # end loop
          ¯k    # get index of global list (inverse) in list of permutations

4

CJam , 16 ไบต์

ri_)e!_@=_$\f#a#

ดัชนีเป็นฐาน 0

ลองออนไลน์!

ฉันไม่ได้มีประสิทธิภาพมากกว่านี้มาก ... หน่วยความจำไม่8เพียงพอกับการตั้งค่าเริ่มต้นของ Java สำหรับอินพุตมากกว่า

คำอธิบาย

ri    e# Read input and convert to integer N.
_)e!  e# Duplicate N, get all permutations of [0 1 ... N].
_@=   e# Duplicate permutations, get the Nth permutation.
_$    e# Duplicate and sort to get the sorted range [0 1 ... N].
\f#   e# For each of these values, get its index in the Nth permutation.
      e# This inverts the permutation.
a#    e# Find the index of this new permutation in the list of all permutations.

3

GAP , 108 ไบต์

h:=l->n->PositionProperty(l,p->l[n]*p=());
f:=n->h(Set(SymmetricGroup(First([1..n],k->Factorial(k)>=n))))(n);

1 การจัดทำดัชนี ไม่ได้ขึ้นบรรทัดใหม่พวกเขาไม่ต้องการ ฉันไม่จำเป็นต้องกำหนดฟังก์ชั่นสุดท้ายให้กับชื่อ แต่ ...

hเป็นฟังก์ชั่น curried ที่รับรายการการเรียงสับเปลี่ยนและดัชนีลงในรายการนั้นและส่งคืนดัชนีของการเปลี่ยนแปลงการผกผัน โดยไม่มีข้อ จำกัด Position(l,l[n]^-1)ฉันเพียงแค่ต้องการทำ สายที่ฟังก์ชั่นที่มีการเปลี่ยนลำดับเรียงลำดับของกลุ่มได้ส่วนใหญ่พอและได้รับfn

ฉันสามารถเขียนSymmetricGroup(n)ได้จากนั้นฟังก์ชันสามารถคำนวณค่าได้สูงสุด 9 เนื่องจากมีโซลูชันที่เล็กกว่าอยู่แล้วฉันชอบที่จะทำสิ่งนี้:

gap> f(100001);
303017

โซลูชั่น 0 ดัชนีที่มีประสิทธิภาพจริง ๆ ที่ใช้งานได้สำหรับอาร์กิวเมนต์ที่ต่ำกว่า 99! (และสามารถทำงานเพื่อให้อาร์กิวเมนต์ต่ำกว่า 999! ที่ราคาหนึ่งไบต์) คืออันนี้:

f:=function(n)
 local m,l,p,i,g;
 m:=First([1..99],k->Factorial(k)>n);
 g:=List([m-1,m-2..0],Factorial);
 l:=[1..m];
 p:=[];
 for i in g do
  Add(p,Remove(l,QuoInt(n,i)+1));
  n:=n mod i;
 od;
 return Sum(ListN(List([1..m],i->Number([1..Position(p,i)],j->p[j]>i)),g,\*));
end;

หลังจากลบช่องว่างนี่มี 255 ไบต์


เยี่ยมมาก! ฉันหวังว่าจะได้รับโซลูชั่นที่มีประสิทธิภาพด้วยเช่นกัน
PurkkaKoodari

3

JavaScript (ES6), 163 120 110 ไบต์

f=(n,a=[],i=0,r=0,[j,...b]=a)=>n?a.splice(n%-~i,0,i)|f(n/++i|0,a,i):i?f(n,b,i-1,b.reduce((r,k)=>r+=k>j,r*i)):r
<input type=number min=0 oninput=o.textContent=f(+this.value)><pre id=o>

0 การจัดทำดัชนี ทำงานโดยการแปลงดัชนีเป็นการเรียงสับเปลี่ยนจากนั้นแปลงกลับเป็นดัชนี แก้ไข: บันทึกประมาณ 25% โดยทำการfสลับและกลับการเปลี่ยนรูปจากนั้นทำการgแปลงการเปลี่ยนแปลงที่กลับรายการกลับเป็นดัชนี บันทึกเพิ่มเติมอีก 10 ไบต์ด้วยการรวมการเรียกซ้ำสองครั้งเป็นฟังก์ชันเดียว Ungolfed:

function index(n) {
    var a = [0];
    for (var i = 1; n = Math.floor(n / i); i++) {
        var j = i - n % (i + 1);
        for (var k = 0; k < i; k++) {
            if (a[k] > j) a[k]++;
        }
        a.push(j);
    }
    a = [...a.keys()].map(k => a.indexOf(k));
    while (i) {
        n *= i--;
        j = a.pop();
        for (k = 0; k < i; k++) {
            if (a[k] > j) n++;
        }
    }
    return n;
}

1
@JanathanAllan ขออภัยฉันคิดว่าฉันเห็นการบันทึก 9- วินาทีสุดท้าย แต่ฉันไม่สามารถทดสอบได้อย่างละเอียด ฉันเปลี่ยนกลับเป็นเวอร์ชันก่อนหน้า
Neil

การนำไปปฏิบัติอย่างรวดเร็วมาก
Jonathan Allan

1
@JanathanAllan กลายเป็นคนที่หยาบคายมากขึ้นถ้าฉันได้รับfการเปลี่ยนวิธีการแทนg...
Neil

3

J, 55 50 ไบต์

g=:/:~i.@#
[:(#\.#.+/@(<{.)\.)@g(-i.)@>:g@g@,/@#:]

บนพื้นฐานของการเขียนเรียงความเจดัชนีเรียงสับเปลี่ยน

รหัสนี้ต้องการหน่วยความจำตามลำดับnแต่ใช้เวลามากขึ้นเนื่องจากจะเรียงลำดับรายการnเวลาและค้นหาnเวลาสำหรับแต่ละดัชนี

การใช้บิวอิน/:ซึ่งสามารถค้นหาเกรดของรายการและการเรียงลำดับของการเรียงสับเปลี่ยนได้มีโซลูชัน 42 ไบต์ที่มีประสิทธิภาพมากขึ้น

[:(#\.#.+/@(<{.)\.)@/:(-i.)@>:/:@/:@,/@#:]

รุ่นนี้ใช้เวลาเพียง 44 วินาทีในการคำนวณกรณีทดสอบล่าสุดเมื่อเปรียบเทียบกับกรณีอื่นซึ่งต้องใช้เวลา 105 วินาที

การใช้

   g =: /:~i.@#
   f =: [:(#\.#.+/@(<{.)\.)@g(-i.)@>:g@g@,/@#:]
   (,.f"0) 0 1 2 3 4 5 6 13 42 100 1000 2000 10000
    0     0
    1     1
    2     2
    3     4
    4     3
    5     5
    6     6
   13    10
   42    51
  100    41
 1000  3628
 2000  3974
10000 30593
   timex 'r =: f 100000'
105.787
   r
303016

+1 สำหรับประสิทธิภาพหน่วยความจำที่ภาษากอล์ฟไม่สามารถสัมผัสได้
Magic Octopus Urn

2

เจลลี่ , 14 13 9ไบต์

-4 ไบต์ขอบคุณที่ @Dennis (ซึ่งเขาแข็งแรงเล่นกอล์ฟต่อไปใช้อย่างรวดเร็วในคำตอบของเขา )

Œ!ịịŒ!$iR

การใช้งานอื่นช้ามาก
การจัดทำดัชนีแบบ 1 งานที่นี่ดังนั้นผลลัพธ์ที่คาดหวังคือ:

input:  1 2 3 4 5 6 7 8  9 10 11
output: 1 2 3 5 4 6 7 8 13 19  9

ไม่มีจุดใดที่จะทำให้การเชื่อมโยง IDE ออนไลน์เป็นไปได้เนื่องจาก TIO สังหารที่อินพุต 10ฆ่าในการป้อนข้อมูลของ ผลลัพธ์ในพื้นที่ (ล่าสุดช้ามากและต้องใช้หน่วยความจำหนึ่งตัน!):

C:\Jelly\jelly-master>python jelly -fu D:\jelly_scripts\revPerm.txt 1
1
C:\Jelly\jelly-master>python jelly -fu D:\jelly_scripts\revPerm.txt 2
2
C:\Jelly\jelly-master>python jelly -fu D:\jelly_scripts\revPerm.txt 3
3
C:\Jelly\jelly-master>python jelly -fu D:\jelly_scripts\revPerm.txt 4
5
C:\Jelly\jelly-master>python jelly -fu D:\jelly_scripts\revPerm.txt 5
4
C:\Jelly\jelly-master>python jelly -fu D:\jelly_scripts\revPerm.txt 6
6
C:\Jelly\jelly-master>python jelly -fu D:\jelly_scripts\revPerm.txt 7
7
C:\Jelly\jelly-master>python jelly -fu D:\jelly_scripts\revPerm.txt 8
8
C:\Jelly\jelly-master>python jelly -fu D:\jelly_scripts\revPerm.txt 9
13
C:\Jelly\jelly-master>python jelly -fu D:\jelly_scripts\revPerm.txt 10
19
C:\Jelly\jelly-master>python jelly -fu D:\jelly_scripts\revPerm.txt 11
9

อย่างไร?

Œ!ịịŒ!$iR - Main link 1: n
      $   - last two links as a monad
    Œ!    -     permutations of implicit range [1,2,3,...,n]
   ị      -     value at index n (the nth permutation)
Œ!        - permutations of implicit range [1,2,3,...,n]
  ị       - value at index (the indexes of the permuted values in the nth permutation)
       i  - index of
        R - range [1,2,3,...,n]

หมายเหตุ: ไม่จำเป็นต้องเรียงลำดับการเรียงสับเปลี่ยนเนื่องจากเราใช้การเรียงลำดับแบบเดียวกันสำหรับทั้งการค้นหาการเรียงสับเปลี่ยนและและกลับกัน


ไม่สามารถทดสอบได้จากโทรศัพท์ของฉัน แต่คุณไม่สามารถกำจัดลิงก์ 2 และสร้างเป็นหลักได้ÇịịÇ$iRหรือไม่
Dennis

ที่จริงแล้วRก่อนหน้าŒ!นี้มีความหมายโดยนัยดังนั้นŒ!ịịŒ!$iRควรทำงาน
Dennis

ใช่นี่เป็นรายการด่วนมากก่อนที่จะพบเพื่อน
Jonathan Allan

2

Python 2, 116 114 ไบต์

from itertools import*
def f(n):r=range(n+1);l=list(permutations(r));print l.index(tuple(l[n].index(v)for v in r))

repl.it

0-based ช้าและหน่วยความจำหิว แต่สั้นไบต์


ไม่ใช้ฟังก์ชันการเรียงสับเปลี่ยน ทั้งหน่วยความจำและเวลามีประสิทธิภาพ 289 285 ไบต์

-4 ไบต์ขอบคุณ @Christian Sievers (การเรียงสับเปลี่ยนเต็มรูปแบบเกิดขึ้นแล้ว)

h=lambda n,v=1,x=1:v and(n>=v and h(n,v*x,x+1)or(v,x-1))or n and h(n-1,0,n*x)or x
i=lambda p,j=0,r=0:j<len(p)and i(p,j+1,r+sum(k<p[j]for k in p[j+1:])*h(len(p)-j-1,0))or r
def f(n):t,x=h(n);g=range(x);o=g[:];r=[];exec"t/=x;x-=1;r+=[o.pop(n/t)];n%=t;"*x;return i([r.index(v)for v in g])

ฉันรู้ว่ามันเป็นรหัสกอล์ฟ แต่ฉันคิดว่า @ Pietu1998 มีความสนใจในการใช้งานที่มีประสิทธิภาพด้วย

เห็นมันในการดำเนินการที่repl.it

ในขณะที่สิ่งนี้ใช้ไบต์มากกว่าการเปรียบเทียบการอ้างอิงเพื่อn=5000000:

ref:    6GB 148s  
this: 200KB <1ms

f เป็นฟังก์ชั่นดัชนีย้อนกลับ

fครั้งแรกที่ได้รับปัจจัยต่อไปข้างต้นn, tและจำนวนเต็มมีปัจจัยที่เป็นxโดยการโทรh(n)และชุดg=range(x), รายการที่จะทำให้ค่าการเปลี่ยนแปลงที่o=g[:]และผู้ถือการเปลี่ยนแปลงที่r=[]

ถัดไปสร้างการเปลี่ยนแปลงที่ดัชนีnโดยpopไอเอ็นจีดัชนีของตัวแทนฐานปัจจัยของnในทางกลับกันจากรายการ, และท้ายพวกเขาไปo rการแสดงฐานแฟคทอเรียลพบได้โดย div และ mod ของnด้วยtซึ่งtdiv'd โดยxและx decrements 1ลงไป

ในที่สุดก็พบว่าดัชนีของการเปลี่ยนแปลงการย้อนกลับโดยการเรียกiด้วยการเปลี่ยนแปลงย้อนกลับ[r.index(v)for v in g]

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

มันอยู่ในสถานะเริ่มต้นv=1และมันจะหลังด้วยการคูณvด้วยx(เช่นเริ่มต้น1) และการเพิ่มขึ้นเรื่อย ๆxจนกระทั่งnอย่างน้อยก็ใหญ่แล้วมันจะส่งกลับvและx-1เป็น tuple

ในการคำนวณn!หนึ่งสายh(n,0)ที่ทวีคูณx(เริ่มต้น1) โดยnและลดลงnจนกระทั่งnเป็น0เมื่อมันกลับxมา

iให้ดัชนี lexicographical ของการเปลี่ยนแปลงpของรายการ[0,1,...n]โดยการเพิ่มผลิตภัณฑ์ของแฟกทอเรียลของฐานแฟกทอเรียลของแต่ละดัชนีh(len(p)-j-1,0)และจำนวนไอเท็มทางด้านขวาของดัชนีนั้นน้อยกว่าค่าที่ดัชนีsum(k<p[j]for k in p[j+1:])นั้น


ฉันคิดว่าคุณไม่จำเป็นต้องใช้กรณีพิเศษเป็นไอเท็มสุดท้ายเมื่อสร้างการเรียงสับเปลี่ยน ฉันไม่ได้ใช้โซลูชัน 255 GAP ของฉัน
Christian Sievers

t/=xฉันจะเพิ่มมันแยกกันในตอนท้ายเพราะมิฉะนั้นจะมีการแบ่งโดยศูนย์ข้อผิดพลาดเมื่อมันไม่
Jonathan Allan

เอาฉันในขณะที่จะเห็น: วงที่มีอยู่แล้วไม่ได้ทั้งหมดคุณสามารถแทนที่โดย(r+o) r
Christian Sievers

เอ่อคุณพูดถูก! ขอบคุณมาก.
Jonathan Allan


1

อันที่จริง , 18 11 ไบต์

คำตอบนี้ใช้อัลกอริทึมในคำตอบ Jelly Dennisแต่มีการจัดทำดัชนี 0 ยินดีต้อนรับคำแนะนำการเล่นกอล์ฟ! ลองออนไลน์!

4╞r;)╨E╨♂#í

Ungolfing

      Implicit input n.
4╞    Push 4 duplicates of n. Stack: n, n, n, n
r;)   Push the range [0...n], and move a duplicate of that range to BOS for later.
╨E    Push the n-length permutations of [0...n] and get perm_list[n].
        Stack: perm_list[n], n, [0...n]
╨     Push the n-length permutations of perm_list[n].
♂#    Convert every "list" in the zip to an actual list.
        Stack: perm(perm_list[n]), [0...n]
í     Get the index of [0...n] in the list of permutations of perm_list[n].
      Implicit return.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.