Introdução
As permutações lexicográficas de uma lista com n elementos podem ser numeradas de 0 a n ! - 1. Por exemplo, os 3! = 6 permutações de (1,2,3)
seria(1,2,3)
, (1,3,2)
, (2,1,3)
, (2,3,1)
, (3,1,2)
, (3,2,1)
.
Quando uma permutação é aplicada a uma lista, seus elementos são ordenados na mesma ordem que os números na permutação. Por exemplo, aplicando a permutação (2,3,1)
aos l = (a,b,c)
rendimentos (l[2],l[3],l[1]) = (b,c,a)
.
O inverso de uma permutação é definido como a permutação que reverte essa operação, ou seja, aplicar uma permutação e, em seguida, seu inverso (ou vice-versa) não modifica a matriz. Por exemplo, o inverso de(2,3,1)
é (3,1,2)
, uma vez que aplica isso a (b,c,a)
rendimentos (a,b,c)
.
Além disso, o inverso de uma permutação aplicado à própria permutação produz os números inteiros 1… n . Por exemplo, aplicando (3,1,2)
a (2,3,1)
rendimentos (1,2,3)
.
Agora, definimos a função revind ( x ) como o índice da permutação inversa da permutação com index x . (Este é o A056019 , se você estiver interessado.)
Como uma permutação com o índice i modifica apenas os últimos k itens da lista, se 0 ≤ i < k !, Podemos adicionar qualquer número de elementos ao início da lista sem afetar revind ( i ). Portanto, o comprimento da lista não afeta o resultado.
Desafio
Sua tarefa é implementar revind ( x ). Você escreverá um programa ou função completo que usa um único número inteiro não negativo x como entrada / argumento e gera / retorna o resultado como um único número inteiro não negativo.
A entrada e a saída podem ser indexadas em 0 ou 1, mas isso deve ser consistente entre elas.
Builtins que geram permutações por índice, retornam o índice de uma permutação ou descobrem que a permutação inversa são banidos. (Construções que geram todas as permutações ou a próxima permutação são permitidas.)
Aplicam-se as regras padrão de código de golfe .
Exemplos
Os exemplos abaixo são indexados em 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
Implementação de referência (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)
extremamente claro. Inclua uma explicação adequada do que é uma permutação inversa.
Ụ
(classificação acima) que classifica os índices de uma matriz pelos seus valores correspondentes. Isso acontece para inverter uma permutação de 1,…, n , mas não funciona para outras permutações. É Ụ
um built-in proibido?