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?