前書き
リストの辞書式の順列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)
。
順列がリストに適用されると、その要素は順列の数字と同じ順序で並べられます。たとえば、yieldsに順列(2,3,1)
を適用しl = (a,b,c)
ます(l[2],l[3],l[1]) = (b,c,a)
。
順列の逆は、この操作を逆にする順列として定義されます。つまり、順列を適用し、その逆(またはその逆)は配列を変更しません。たとえば、yの逆(2,3,1)
は(3,1,2)
、(b,c,a)
yieldsに適用されるため(a,b,c)
です。
また、順列自体に適用される順列の逆は、整数1… nを生成します。たとえば、yields に適用(3,1,2)
し(2,3,1)
ます(1,2,3)
。
私たちは今、関数定義revind(Xをインデックスと順列の逆置換の指標として)のx。(興味がある場合、これはA056019です。)
インデックスの順列ので、私は唯一の最後の変更のkリストの項目を場合に限っ 0≤ I < K!、我々は影響を与えずに、リストの先頭に任意の数の要素を追加することができますrevind(Iを)。したがって、リストの長さは結果に影響しません。
チャレンジ
あなたのタスクは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の順列を反転させますが、他の順列では機能しません。Ụ
禁じられビルトイン?