ソートアルゴリズムの非常に一般的なパターンを次に示します。
def sort(l):
while not is_sorted(l):
choose indices i, j
assert i < j
if l[i] > l[j]:
l[i], l[j] = l[j], l[i]
これらのアルゴリズムは、インデックスi
とj
がリストの状態に基づいて慎重に選択されるため、うまく機能しますl
。
しかし、が表示されずl
、盲目的に選択しなければならなかった場合はどうなりますか?それではリストをどれくらい速くソートできますか?
あなたの課題は、の長さのみを指定して、インデックスのランダムなペアを出力する関数を書くことですl
。具体的には、出力2つのインデックス、しなければならないi, j
、と0 <= i < j < len(l)
。関数は任意の長さのリストで機能するはずですが、長さ100のリストでスコアリングされます。
スコアは、上記のパターンに従って一様にランダムにシャッフルされたリストをソートするために必要なインデックス選択の平均数であり、インデックスは関数に従って選択されます。
長さ100の均一にランダムにシャッフルされたリストで、繰り返しのエントリなしで、1000回を超える試行のインデックス選択の平均数を取得して、提出物を採点します。
提出物が明らかに非競争的または終了しない場合、私はより少ないトライアルを実行する権利を留保します。複数の上位の提出物が計算リソースの限界でエラーの範囲内に残っている場合、さらなる計算リソースを負担できるようになるまで、以前の提出物を勝者と宣言します。
Pythonのスコアリングプログラムの例を次に示します。
import random
def is_sorted(l):
for x in range(len(l)-1):
if l[x] > l[x+1]:
return False
return True
def score(length, index_chooser):
steps = 0
l = list(range(length))
random.shuffle(l)
while not is_sorted(l):
i, j = index_chooser(length)
assert (i < j)
if l[i] > l[j]:
l[i], l[j] = l[j], l[i]
steps += 1
return steps
あなたの関数は、相互作用のグローバル変数と、任意の可変状態を維持するリストには影響しないかもしれないl
、などあなたの関数の唯一の入力は、リストの長さでなければならないl
、そしてそれは、出力範囲の整数の順序対をしなければならない[0, len(l)-1]
(または、あなたの言語のための適切なリストのインデックス作成)。コメントで何か許可されているかどうかお気軽にお問い合わせください。
投稿は、自由に使用できる言語で行うことができます。あなたの言語にまだ投稿されていない場合は、スコアリングハーネスを含めてください。暫定スコアを投稿することもできますが、公式スコアとともにコメントを残します。
スコアリングは、長さ100の一様にランダムにシャッフルされたリスト上のソート済みリストへの平均ステップ数です。幸運を祈ります。