Wprowadzenie
Permutacje leksykograficzne listy zawierającej n elementów mogą być ponumerowane od 0 do n ! - 1. Na przykład 3! = 6 permutacji (1,2,3)
byłoby (1,2,3)
, (1,3,2)
, (2,1,3)
,(2,3,1)
, (3,1,2)
, (3,2,1)
.
Po zastosowaniu permutacji do listy jej elementy są uporządkowane w tej samej kolejności, co liczby w permutacji. Na przykład zastosowanie permutacji (2,3,1)
dol = (a,b,c)
wydajności (l[2],l[3],l[1]) = (b,c,a)
.
Odwrotność permutacji jest definiowana jako permutacja, która odwraca tę operację, tj. Zastosowanie permutacji, a następnie jej odwrotność (lub odwrotnie) nie modyfikuje tablicy. Na przykład odwrotność (2,3,1)
jest (3,1,2)
, ponieważ stosuje się to do (b,c,a)
zbiorów (a,b,c)
.
Również odwrotność permutacji zastosowana do samej permutacji daje liczby całkowite 1… n . Na przykład zastosowanie (3,1,2)
do (2,3,1)
plonów (1,2,3)
.
Definiujemy teraz funkcję revind ( x ) jako indeks odwrotnej permutacji permutacji o indeksie x . (To jest A056019 , jeśli jesteś zainteresowany.)
Ponieważ permutacja z indeksem i modyfikuje tylko ostatnie k elementów listy iff 0 ≤ i < k !, Możemy dodać dowolną liczbę elementów na początku listy bez wpływu na revind ( i ). Dlatego długość listy nie wpływa na wynik.
Wyzwanie
Twoim zadaniem jest zaimplementowanie revind ( x ). Napiszemy pełny program lub funkcję, która przyjmuje jedną nieujemną liczbę całkowitą x jako dane wejściowe / argument i wyprowadza / zwraca wynik jako jedną nieujemną liczbę całkowitą.
Dane wejściowe i wyjściowe mogą być indeksowane 0 lub indeksowane 1, ale musi to być spójne między nimi.
Wbudowane, które generują permutacje według indeksu, zwracają indeks permutacji lub znajdują odwrotną permutację, są zakazane. (Wbudowane, które generują wszystkie permutacje lub następne permutacje są dozwolone.)
Standardowy golf zasady .
Przykłady
Poniższe przykłady są indeksowane według 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
Implementacja referencyjna (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)
wyjątkowo niejasny. Proszę załączyć właściwe wyjaśnienie, czym jest odwrotna permutacja.
Ụ
(stopień w górę), który sortuje indeksy tablicy według odpowiadających im wartości. To dzieje się odwrócić permutacji 1, ..., n , ale to nie działa dla innych permutacji. Czy Ụ
zabronione jest wbudowane?