Вступление
Лексикографические перестановки списка с 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 , если вам интересно.)
Поскольку перестановка с индексом i изменяет только последние k элементов списка, если 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]
(a,b,c)
крайне неясным. Пожалуйста, включите правильное объяснение того, что такое обратная перестановка.
Ụ
(повышение класса), который сортирует индексы массива по их соответствующим значениям. Это происходит, чтобы инвертировать перестановку 1,…, n , но это не работает для других перестановок. Это Ụ
запрещенный встроенный?