introduzione
Le permutazioni lessicografiche di un elenco con n elementi possono essere numerate da 0 a n ! - 1. Ad esempio, il 3! = 6 permutazioni di (1,2,3)sarebbero (1,2,3), (1,3,2), (2,1,3), (2,3,1), (3,1,2), (3,2,1).
Quando una permutazione viene applicata a un elenco, i suoi elementi vengono ordinati nello stesso ordine dei numeri nella permutazione. Ad esempio, applicando la permutazione (2,3,1)ai l = (a,b,c)rendimenti (l[2],l[3],l[1]) = (b,c,a).
L'inverso di una permutazione è definito come la permutazione che inverte questa operazione, ovvero l'applicazione di una permutazione e quindi il suo inverso (o viceversa) non modifica l'array. Ad esempio, l'inverso di (2,3,1)è (3,1,2), poiché applicandolo ai (b,c,a)rendimenti (a,b,c).
Inoltre, l'inverso di una permutazione applicata alla permutazione stessa produce gli interi 1 ... n . Ad esempio, applicando (3,1,2)ai (2,3,1)rendimenti (1,2,3).
Definiamo ora la funzione revind ( x ) come indice della permutazione inversa della permutazione con indice x . (Questo è A056019 , se sei interessato.)
Poiché una permutazione con indice i modifica solo gli ultimi k elementi dell'elenco iff 0 ≤ i < k !, possiamo aggiungere un numero qualsiasi di elementi all'inizio dell'elenco senza influenzare revind ( i ). Pertanto la lunghezza dell'elenco non influisce sul risultato.
Sfida
Il tuo compito è implementare revind ( x ). Scriverai un programma o una funzione completa che accetta un singolo intero non negativo x come input / argomento e restituisce / restituisce il risultato come un singolo numero intero non negativo.
L'input e l'output possono essere 0-index o 1-index, ma questo deve essere coerente tra loro.
I builtin che generano permutazioni per indice, restituiscono l'indice di una permutazione o trovano la permutazione inversa sono vietati. (Sono consentiti i builtin che generano tutte le permutazioni o la permutazione successiva.)
Si applicano le regole standard del code-golf .
Esempi
Gli esempi seguenti sono indicizzati 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
Implementazione di riferimento (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)estremamente chiaro. Si prega di includere una spiegazione corretta di cosa sia una permutazione inversa.
Ụ(grado superiore) che ordina gli indici di un array in base ai loro valori corrispondenti. Questo accade a invertire una permutazione di 1, ..., n , ma non funziona per altri permutazioni. È Ụvietato un built-in?