前書き
n
オブジェクトのランダムな順列が渡されたとします。順列はボックスに密封されているため、どの順列であるかわかりませんn!
。順列をn
個別のオブジェクトに適用できた場合、すぐにそのアイデンティティを推測できます。ただし、置換は長さn
バイナリベクトルにのみ適用できます。つまり、それを認識するために数回適用する必要があります。明らかに、n
たった1つでベクトルに適用することで1
仕事はできますが、賢いのであれば、log(n)
アプリケーションでそれを行うことができます。ただし、そのメソッドのコードは長くなります...
これは実験的な課題であり、スコアはコード長とクエリの複雑さの組み合わせ、つまり補助プロシージャの呼び出し回数です。仕様は少し長いので、ご容赦ください。
タスク
あなたの仕事は、0ベースまたは1ベースのインデックス付けを使用して、入力として正の整数と最初の整数の順列をとる名前付き関数(またはそれに最も近いもの) を書くことです。その出力は置換です。ただし、順列に直接アクセスすることはできません。これでできることは、ビットのベクトルに適用することだけです。この目的のために、順列とビットのベクトルを取り込んで、th座標がbitを含む順列ベクトルを返す補助関数を使用します。例えば:f
n
p
n
p
p
n
P
p
v
p[i]
v[i]
P([1,2,3,4,0], [1,1,0,0,0]) == [0,1,1,0,0]
「ビット」は、3
and -4
、or 'a'
、and などの任意の2つの異なる値に置き換えることができ、'b'
修正する必要はありません。そのためP
、[-4,3,3,-4]
と[2,2,2,1]
への同じ呼び出しで両方を呼び出すことができますf
。の定義はP
スコアにカウントされません。
得点
特定の入力に対するソリューションのクエリの複雑さは、補助関数を呼び出す回数ですP
。この尺度を明確にするためには、解決策は決定的でなければなりません。疑似ランダムに生成された数値を使用できますが、ジェネレーターの初期シードも修正する必要があります。
ではこのリポジトリあなたはというファイル見つけることができますpermutations.txt
(1ベースの場合の各番号をインクリメント)0ベースのインデックスを使用して、505個の順列、50と150までの間の各長さの5が含まれています。各順列は独自の行にあり、その番号はスペースで区切られています。スコアは、これらの入力のバイト数f
+平均クエリの複雑さです。最低スコアが勝ちます。
追加ルール
説明付きのコードが推奨され、標準の抜け穴は許可されません。特に、個々のビットは区別できません(したがって、Integer
オブジェクトのベクトルを与えてP
そのアイデンティティを比較することはできません)。関数P
は入力を再配置する代わりに常に新しいベクトルを返します。f
およびの名前、およびP
それらが引数を取る順序を自由に変更できます。
プログラミング言語で最初に回答するP
場合は、呼び出された回数もカウントする関数の実装など、テストハーネスを含めることを強くお勧めします。例として、Python 3のハーネスを次に示します。
def f(n,p):
pass # Your submission goes here
num_calls = 0
def P(permutation, bit_vector):
global num_calls
num_calls += 1
permuted_vector = [0]*len(bit_vector)
for i in range(len(bit_vector)):
permuted_vector[permutation[i]] = bit_vector[i]
return permuted_vector
num_lines = 0
file_stream = open("permutations.txt")
for line in file_stream:
num_lines += 1
perm = [int(n) for n in line.split()]
guess = f(len(perm), perm)
if guess != perm:
print("Wrong output\n %s\n given for input\n %s"%(str(guess), str(perm)))
break
else:
print("Done. Average query complexity: %g"%(num_calls/num_lines,))
file_stream.close()
一部の言語では、このようなハーネスを作成することはできません。最も注目すべきは、Haskellは、純粋な関数P
が呼び出された回数を記録することを許可しないことです。このため、クエリの複雑度も計算し、それをハーネスで使用するようにソリューションを再実装できます。
abaaabababaa
と-4 3 3 3 -4 3
ビットのベクトルになります。