introduction
Les permutations lexicographiques d'une liste à n éléments peuvent être numérotées de 0 à n ! - 1. Par exemple, le 3! = 6 permutations (1,2,3)
seraient (1,2,3)
, (1,3,2)
, (2,1,3)
, (2,3,1)
, (3,1,2)
, (3,2,1)
.
Lorsqu'une permutation est appliquée à une liste, ses éléments sont ordonnés dans le même ordre que les nombres dans la permutation. Par exemple, appliquer la permutation (2,3,1)
aux l = (a,b,c)
rendements (l[2],l[3],l[1]) = (b,c,a)
.
L'inverse d'une permutation est défini comme la permutation qui inverse cette opération, c'est-à-dire que l'application d'une permutation et que son inverse (ou vice versa) ne modifie pas le tableau. Par exemple, l'inverse de (2,3,1)
est (3,1,2)
, car cela s'applique aux (b,c,a)
rendements (a,b,c)
.
De plus, l'inverse d'une permutation appliquée à la permutation elle-même donne les entiers 1… n . Par exemple, appliquer (3,1,2)
aux (2,3,1)
rendements (1,2,3)
.
Nous définissons maintenant la fonction revind ( x ) comme l'indice de la permutation inverse de la permutation d'indice x . (Ceci est A056019 , si vous êtes intéressé.)
Puisqu'une permutation d'indice i ne modifie que les k derniers éléments de la liste si sf 0 ≤ i < k !, Nous pouvons ajouter un nombre quelconque d'éléments au début de la liste sans affecter revind ( i ). Par conséquent, la longueur de la liste n'affecte pas le résultat.
Défi
Votre tâche consiste à implémenter revind ( x ). Vous écrirez un programme ou une fonction complète qui prend un seul entier non négatif x comme entrée / argument et génère / renvoie le résultat comme un seul entier non négatif.
L'entrée et la sortie peuvent être indexées 0 ou indexées 1, mais cela doit être cohérent entre elles.
Les builtins qui génèrent des permutations par index, renvoient l'index d'une permutation ou trouvent la permutation inverse sont interdits. (Les Builtins qui génèrent toutes les permutations ou la permutation suivante sont autorisés.)
Les règles de code-golf standard s'appliquent.
Exemples
Les exemples ci-dessous sont indexés 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
Implémentation de référence (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)
extrêmement peu clair. Veuillez inclure une explication appropriée de ce qu'est une permutation inverse.
Ụ
(grade up) qui trie les indices d'un tableau par leurs valeurs correspondantes. Cela se produit pour inverser une permutation de 1,…, n , mais cela ne fonctionne pas pour les autres permutations. Un Ụ
intégré est-il interdit?