Вступ
Лексикографічні перестановки списку з п елементами можуть бути пронумеровані від 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 , якщо вам це цікаво.)
Оскільки перестановка з індексом i змінює лише останні k елементи списку iff 0 ≤ i < k !, Ми можемо додати будь-яку кількість елементів до початку списку, не впливаючи на revind ( i ). Тому довжина списку не впливає на результат.
Виклик
Ваше завдання - реалізувати перемотування ( 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]
(a,b,c)
вкрай незрозумілим. Будь ласка, додайте належне пояснення, що таке обернена перестановка.
Ụ
(grade up), який сортує індекси масиву за відповідними значеннями. Це трапляється для перетворення перестановки 1,…, n , але це не працює для інших перестановок. Чи Ụ
заборонений вбудований?