Introducción
¡Las permutaciones lexicográficas de una lista con n elementos pueden numerarse de 0 a n ! - 1. Por ejemplo, los 3! = 6 permutaciones de (1,2,3)serían (1,2,3), (1,3,2), (2,1,3), (2,3,1), (3,1,2), (3,2,1).
Cuando se aplica una permutación a una lista, sus elementos se ordenan en el mismo orden que los números de la permutación. Por ejemplo, aplicando la permutación (2,3,1)a los l = (a,b,c)rendimientos (l[2],l[3],l[1]) = (b,c,a).
La inversa de una permutación se define como la permutación que invierte esta operación, es decir, aplicar una permutación y luego su inversa (o viceversa) no modifica la matriz. Por ejemplo, el inverso de (2,3,1)es (3,1,2), ya que aplica eso a los (b,c,a)rendimientos (a,b,c).
Además, la inversa de una permutación aplicada a la permutación misma produce los enteros 1 ... n . Por ejemplo, aplicando (3,1,2)a (2,3,1)rendimientos (1,2,3).
Ahora definimos la función revind ( x ) como el índice de la permutación inversa de la permutación con el índice x . (Esto es A056019 , si está interesado).
Dado que una permutación con índice i solo modifica los últimos k elementos de la lista iff 0 ≤ i < k !, Podemos agregar cualquier número de elementos al comienzo de la lista sin afectar revind ( i ). Por lo tanto, la longitud de la lista no afecta el resultado.
Desafío
Su tarea es implementar revind ( x ). Escribirás un programa o función completa que tome un solo entero x no negativo como entrada / argumento y produzca / devuelva el resultado como un solo entero no negativo.
La entrada y la salida pueden estar indexadas a 0 o indexadas a 1, pero esto debe ser coherente entre ellas.
Las incorporaciones que generan permutaciones por índice, devuelven el índice de una permutación o encuentran la permutación inversa están prohibidas. (Se permiten las construcciones que generan todas las permutaciones o la próxima permutación).
Aplican reglas estándar de código de golf .
Ejemplos
Los siguientes ejemplos están indexados a 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
Implementación de referencia (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)extremadamente poco claro. Incluya una explicación adecuada de lo que es una permutación inversa.
Ụ(grado superior) que clasifica los índices de una matriz por sus valores correspondientes. Esto sucede para invertir una permutación de 1, ..., n , pero no funciona para otras permutaciones. ¿Está Ụprohibido incorporarlo?