介绍
具有n个元素的列表的字典排列可以从0到n编号!-1.例如3!= 6个置换(1,2,3)
将是(1,2,3)
,(1,3,2)
,(2,1,3)
,(2,3,1)
,(3,1,2)
,(3,2,1)
。
将排列应用于列表时,其元素的排列顺序与排列中的数字相同。例如,将置换(2,3,1)
应用于l = (a,b,c)
yield (l[2],l[3],l[1]) = (b,c,a)
。
排列的逆定义为颠倒此操作的排列,即应用排列,然后其逆(反之亦然)不会修改数组。例如,(2,3,1)
is 的逆(3,1,2)
,因为将其应用于(b,c,a)
yields (a,b,c)
。
同样,应用于排列本身的排列的逆值会产生整数1… n。例如,应用(3,1,2)
到(2,3,1)
产率(1,2,3)
。
现在,我们将函数revind(x)定义为索引为x的排列的逆排列的索引。(如果您有兴趣,这是A056019。)
由于与指数置换我只修改了最后ķ列表中的项目当且仅当 0≤ 我 < ķ!,我们可以添加任意数量的元素到列表的开始,而不会影响revind(我)。因此,列表的长度不影响结果。
挑战
您的任务是实现revind(x)。您将编写一个完整的程序或函数,以单个非负整数x作为输入/参数,并以单个非负整数输出/返回结果。
输入和输出可以是0索引或1索引,但是它们之间必须保持一致。
禁止按索引生成排列,返回排列的索引或找到逆排列的内建函数。(允许生成所有排列或下一个排列的构建体。)
适用标准代码高尔夫球规则。
例子
下面的示例是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
参考实现(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)
非常不清楚。请适当说明反向排列是什么。
Ụ
(升序),该原子按数组的相应值对数组的索引进行排序。这恰好颠倒的排列1,...,N,但它并不适用于其它置换工作。被Ụ
禁止的内建?