Giới thiệu
Các hoán vị từ vựng của một danh sách với n phần tử có thể được đánh số từ 0 đến n ! - 1. Ví dụ: 3! = 6 hoán vị của (1,2,3)
sẽ (1,2,3)
, (1,3,2)
, (2,1,3)
, (2,3,1)
, (3,1,2)
, (3,2,1)
.
Khi một hoán vị được áp dụng cho một danh sách, các phần tử của nó được sắp xếp theo thứ tự giống như các số trong hoán vị. Ví dụ, áp dụng hoán vị (2,3,1)
cho l = (a,b,c)
năng suất (l[2],l[3],l[1]) = (b,c,a)
.
Nghịch đảo của một hoán vị được định nghĩa là hoán vị đảo ngược hoạt động này, tức là áp dụng một hoán vị và sau đó nghịch đảo của nó (hoặc ngược lại) không sửa đổi mảng. Ví dụ, nghịch đảo (2,3,1)
là (3,1,2)
, kể từ khi áp dụng điều đó vào (b,c,a)
năng suất (a,b,c)
.
Ngoài ra, nghịch đảo của hoán vị áp dụng cho các hoán vị riêng của mình mang lại các số nguyên từ 1 ... n . Ví dụ, áp dụng (3,1,2)
cho (2,3,1)
năng suất (1,2,3)
.
Bây giờ chúng ta định nghĩa hàm revind ( x ) là chỉ số của hoán vị nghịch đảo của hoán vị với chỉ số x . (Đây là A056019 , nếu bạn quan tâm.)
Vì hoán vị với chỉ mục i chỉ sửa đổi các mục k cuối cùng của danh sách iff 0 ≤ i < k !, Nên chúng tôi có thể thêm bất kỳ số phần tử nào vào đầu danh sách mà không ảnh hưởng đến revind ( i ). Do đó độ dài của danh sách không ảnh hưởng đến kết quả.
Thử thách
Nhiệm vụ của bạn là thực hiện revind ( x ). Bạn sẽ viết một chương trình hoặc hàm đầy đủ có một số nguyên không âm x là đầu vào / đối số và xuất / trả về kết quả dưới dạng một số nguyên không âm.
Đầu vào và đầu ra có thể là 0-index hoặc 1-index, nhưng điều này phải nhất quán giữa chúng.
Các nội trang tạo ra hoán vị theo chỉ mục, trả về chỉ mục của hoán vị hoặc tìm hoán vị nghịch đảo đều bị cấm. (Được phép tạo ra tất cả các hoán vị hoặc hoán vị tiếp theo.)
Luật golf tiêu chuẩn được áp dụng.
Ví dụ
Các ví dụ dưới đây được lập chỉ mục 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
Tham chiếu thực hiện (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)
cực kỳ không rõ ràng. Vui lòng bao gồm một lời giải thích thích hợp về hoán vị nghịch đảo là gì.
Ụ
(tăng cấp) sắp xếp các chỉ số của một mảng theo các giá trị tương ứng của chúng. Điều này xảy ra để đảo ngược một hoán vị 1, Mạnh, n , nhưng nó không hoạt động cho các hoán vị khác. Là Ụ
một cấm tích hợp?