順列番号付け


9

チャレンジ

n個の整数の特定のセットについて、辞書式インデックスを出力するプログラムを記述します。

ルール

  • 入力は、スペースで区切られた一意の非負の整数のセットでなければなりません。
  • 順列の辞書式インデックス(範囲0〜n!-1を含む)を出力する必要があります。
  • 順列ライブラリまたは順列ビルトインは使用できません。
  • インデックスの検索に役立つように、入力の順列のセットまたは順列のサブセットを生成することはできません。
  • また、指定された順列を次または前の(辞書式に)順列にインクリメントまたはデクリメントすることもできません。
  • 階乗を使用せずにこれを完了する方法が見つかった場合、ボーナスポイント(-10バイト)。
  • n = 100の場合、実行時間は1分未満である必要があります
  • バイト数による最短コードの勝ち
  • 火曜日に選ばれた勝者(2014年7月22日)

順列の詳細

0 1 2 --> 0
0 2 1 --> 1
1 0 2 --> 2
1 2 0 --> 3
2 0 1 --> 4
2 1 0 --> 5
0 1 2 3 4 5 6 7 --> 0
0 1 2 3 4 5 7 6 --> 1
0 1 2 3 4 6 5 7 --> 2
1 3 5 17        --> 0
781 780 779 13  --> 23
81 62 19 12 11 8 2 0 --> 40319
195 124 719 1 51 6 3 --> 4181

1
勝者が選ばれるまで、もう少し時間がありますか?三日では時間が足りません。
xnor 2014

回答:


4

GolfScript、12(22文字-10ボーナス)

~]0\.,{.,@*\.(@$?@+\}*

階乗を使用しない場合のボーナスポイント。入力は、質問に記述されている形式でSTDINに指定する必要があります。オンラインでコードを試すことができます


「階乗を使わないで」と言ったときに私が探していたものとはかなり違うが、それは重要だと思う。称賛
カイル・マコーミック14

4

CJam、31、階乗付き

q~]{__(f<0+:+\,,(;1+:**\(;}h]:+

なぜ私はまだ賛成票を投じているのですか?GolfScriptの回答はCJamで23文字だけで書き換えることができます。
jimmy23013 2014

6
人々はあなたの答えが好きだからです。
seequ

1

Python 2(77 = 87-10)

p=map(int,raw_input().split())
s=0
while p:s=s*len(p)+sorted(p).index(p.pop(0))
print s

そのような読みやすい。多くの組み込み。ワオ。

順列の辞書式インデックスは、その要素の上の逆数(その後ろの値であるがその下の値)の順列の要素の合計に、その後の要素の数の階乗を掛けたものであるという事実を使用します。この多項式のような式を項ごとに評価するのではなく、ホーナーの方法に似たものを使用します。

次に、配列インデックスをループする代わりに、リストの最初の要素を繰り返し削除し、残りの要素を処理します。この式sorted(p).index(p.pop(0))は、並べ替えられたリスト内の位置を取得すると同時に、削除を実行することにより、最初のインデックスを過ぎた反転の数をカウントします。

悲しいことに、Python 3ではリストオブジェクトをサポートしないマップオブジェクトが生成されるため、Python 2を使用してさらに4文字raw_input(の場合は-1 printmap(int,...)を使用する必要がありました。


1

バース(13 = 23-10)

JVPwdWJ=Z+*ZlJXovNJ;J)Z

私のPython回答の移植版。

Pythonの翻訳(いくつかの無関係なものを除外):

Z=0
J=rev(split(input()," "))
while J:
 Z=plus(times(Z,len(J)),index(order(lambda N:eval(N),J),J.pop()))
print(Z)

入力番号は文字列のままですが、evalをキーとして使用して整数としてソートされます。リストが逆になっているためpop、背面ではなく前面になります。


1

コブラ-202

明らかに、コブラはこれで本当に競争していません。

class P
    var n=0
    var t=CobraCore.commandLineArgs[1:]
    def main
        .f(.t[0:0])
    def f(l as List<of String>)
        if.t.count==l.count,print if(.t<>l,'',.n+=1)
        else,for i in.t.sorted,if i not in l,.f(l+[i])

0

J、5バイト(15-10)

#\.#.+/@(<{.)\.

これはOn 2)時間で実行され、n = 100を簡単に処理できます。

使用法

   f =: #\.#.+/@(<{.)\.
   f 0 1 2
0
   f 0 2 1
1
   f 1 0 2
2
   f 1 2 0
3
   f 2 0 1
4
   f 2 1 0
5
   f 0 1 2 3 4 5 6 7
0
   f 0 1 2 3 4 5 7 6
1
   f 0 1 2 3 4 6 5 7
2
   f 1 3 5 17
0
   f 781 780 779 13
23
   f 81 62 19 12 11 8 2 0
40319
   f 195 124 719 1 51 6 3
4181
   NB. A. is the builtin for permutation indexing
   timex 'r =: f 927 A. i. 100'
0.000161
   r
927

説明

#\.#.+/@(<{.)\.  Input: array P
             \.  For each suffix of P
          {.       Take the head
         <         Test if it is greater than each of that suffix
     +/@           Sum, count the number of times it is greater
#\.              Get the length of each suffix of P
   #.            Convert to decimal using a mixed radix
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.