pengantar
Permutasi leksikografis dari daftar dengan elemen n dapat dinomori dari 0 hingga n ! - 1. Misalnya, 3! = 6 permutasi dari (1,2,3)
akan (1,2,3)
, (1,3,2)
, (2,1,3)
, (2,3,1)
, (3,1,2)
, (3,2,1)
.
Ketika permutasi diterapkan ke daftar, elemen-elemennya disusun dalam urutan yang sama dengan angka dalam permutasi. Sebagai contoh, menerapkan permutasi (2,3,1)
ke l = (a,b,c)
hasil (l[2],l[3],l[1]) = (b,c,a)
.
Kebalikan dari permutasi didefinisikan sebagai permutasi yang membalikkan operasi ini, yaitu menerapkan permutasi dan kemudian kebalikannya (atau sebaliknya) tidak mengubah array. Misalnya, kebalikannya (2,3,1)
adalah (3,1,2)
, sejak menerapkannya pada (b,c,a)
hasil (a,b,c)
.
Juga, kebalikan permutasi yang diterapkan pada permutasi itu sendiri menghasilkan bilangan bulat 1 ... n . Misalnya, menerapkan (3,1,2)
untuk (2,3,1)
hasil (1,2,3)
.
Kami sekarang mendefinisikan fungsi revind ( x ) sebagai indeks permutasi terbalik dari permutasi dengan indeks x . (Ini A056019 , jika Anda tertarik.)
Karena permutasi dengan indeks saya hanya memodifikasi item k terakhir dari daftar iff 0 ≤ i < k !, kita dapat menambahkan sejumlah elemen ke awal daftar tanpa mempengaruhi revind ( i ). Oleh karena itu panjang daftar tidak mempengaruhi hasilnya.
Tantangan
Tugas Anda adalah mengimplementasikan revind ( x ). Anda akan menulis program atau fungsi lengkap yang menggunakan satu integer nonnegatif x sebagai input / argumen dan menghasilkan / mengembalikan hasilnya sebagai integer nonnegatif tunggal.
Input dan output mungkin 0-diindeks atau 1-diindeks, tetapi ini harus konsisten di antara mereka.
Bawaan yang menghasilkan permutasi dengan indeks, mengembalikan indeks permutasi atau menemukan permutasi terbalik dilarang. (Builtin yang menghasilkan semua permutasi atau permutasi berikutnya diizinkan.)
Aturan standar kode-golf berlaku.
Contohnya
Contoh di bawah ini adalah 0-diindeks.
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
Implementasi referensi (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]
(a,b,c)
sangat tidak jelas. Harap sertakan penjelasan yang tepat tentang apakah permutasi terbalik itu.
Ụ
(tingkat atas) yang mengurutkan indeks array dengan nilai yang sesuai. Ini terjadi untuk membalikkan permutasi 1, ..., n , tetapi itu tidak berfungsi untuk permutasi lainnya. Apakah Ụ
built-in terlarang?