Einführung
Die lexikographischen Permutationen einer Liste mit n Elementen können von 0 bis n nummeriert werden ! - 1. Zum Beispiel die 3! = 6 Permutationen (1,2,3)
wären (1,2,3)
, (1,3,2)
, (2,1,3)
, (2,3,1)
, (3,1,2)
, (3,2,1)
.
Wenn eine Permutation auf eine Liste angewendet wird, werden ihre Elemente in derselben Reihenfolge wie die Nummern in der Permutation sortiert. Zum Beispiel die Permutation (2,3,1)
auf l = (a,b,c)
Ausbeuten anwenden (l[2],l[3],l[1]) = (b,c,a)
.
Die Umkehrung einer Permutation ist definiert als die Permutation, die diesen Vorgang umkehrt, dh eine Permutation anwendet und dann durch ihre Umkehrung (oder umgekehrt) das Array nicht verändert. Zum Beispiel kann die Inverse von (2,3,1)
IS (3,1,2)
, da das Aufbringen (b,c,a)
Ausbeuten (a,b,c)
.
Auch die Umkehrung einer Permutation, die auf die Permutation selbst angewendet wird, ergibt die ganzen Zahlen 1… n . Zum Beispiel (3,1,2)
auf (2,3,1)
Renditen anwenden (1,2,3)
.
Wir definieren nun die Funktion revind ( x ) als Index der inversen Permutation der Permutation mit dem Index x . (Dies ist A056019 , wenn Sie interessiert sind.)
Da eine Permutation mit Index i nur die letzten k Elemente der Liste ändert, wenn 0 ≤ i < k ! Ist , können wir eine beliebige Anzahl von Elementen an den Anfang der Liste setzen, ohne revind ( i ) zu beeinflussen. Daher hat die Länge der Liste keinen Einfluss auf das Ergebnis.
Herausforderung
Ihre Aufgabe ist es, revind ( x ) zu implementieren . Sie schreiben ein vollständiges Programm oder eine Funktion, die eine einzelne nichtnegative Ganzzahl x als Eingabe / Argument verwendet und das Ergebnis als einzelne nichtnegative Ganzzahl ausgibt / zurückgibt.
Die Eingabe und Ausgabe können 0-indiziert oder 1-indiziert sein, dies muss jedoch zwischen ihnen konsistent sein.
Builtins, die Permutationen nach Index generieren, den Index einer Permutation zurückgeben oder die inverse Permutation finden, sind gesperrt. (Builtins, die alle Permutationen oder die nächste Permutation erzeugen, sind erlaubt.)
Es gelten die Standardregeln für Code-Golf .
Beispiele
Die folgenden Beispiele sind 0-indiziert.
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
Referenzimplementierung (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)
extrem unübersichtlich. Bitte erläutern Sie genau, was eine inverse Permutation ist.
Ụ
(grade up), das die Indizes eines Arrays nach ihren entsprechenden Werten sortiert. Dies geschieht, um eine Permutation von 1, ..., n zu invertieren , funktioniert jedoch nicht für andere Permutationen. Ist Ụ
eine verbotene eingebaut?