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?