この最適化の課題では、stdoutでユーザーにstdinで比較結果を入力するように要求することで要素を比較するだけで単一の配列をソートするプログラムを記述します。
以下のプロトコルは行ベースなので、標準出力に出力したり、標準入力から読み込んだりするたびに、改行が続くと想定されます。以下の質問全体を通して、ユーザー(読み取り:スコアリングプログラム)には、0から始まるインデックス付き配列と呼ばれる配列にソートしたい配列があると想定されていますarray
。技術的な理由から、私はすべての印刷後にスタウトにフラッシュすることをお勧めします。
- 最初のステップとして、プログラムは
n
stdinから配列サイズを読み取る必要があります。 - その後、
a < b
何度でも、2つの整数を使用してstdoutに出力できます0 <= a, b < n
。その後、ユーザーが入力されます1
場合は標準入力でarray[a] < array[b]
、そして0
それ以外の場合は。 最後に、プログラムが配列の順序を正しく推定したと確信すると、プログラムは
a ...
stdoutに出力する必要があります...
。したがって、プログラムが出力a 3 0 1 4 2
する場合は、プログラムが推定したことを意味しますarray[3] <= array[0] <= array[1] <= array[4] <= array[2]
あなたのプログラムはの内容を決して知らず、決して知らないことに注意してください
array
。
<
stdinで配列をソートするように要求することしかできません。これらの同値により、他の比較演算を取得できます。
a > b b < a
a <= b !(b < a)
a >= b !(a < b)
a != b (a < b) || (b < a)
a == b !(a < b) && !(b < a)
最後に、プログラムがstdoutのスコアリングプログラムと対話するため、デバッグ情報をstderrに出力します。
プログラムは、次のPythonプログラムを使用して採点されます。
from __future__ import print_function
from subprocess import Popen, PIPE
import sys, random
def sort_test(size):
array = [random.randrange(0, size) for _ in range(size)]
pipe = Popen(sys.argv[1:], stdin=PIPE, stdout=PIPE, bufsize=0, universal_newlines=True)
print(str(size), file=pipe.stdin); pipe.stdin.flush()
num_comparisons = 0
while True:
args = pipe.stdout.readline().strip().split()
if args and args[0] == "a":
answer_array = [array[int(n)] for n in args[1:]]
if list(sorted(array)) != answer_array:
raise RuntimeError("incorrect sort for size {}, array was {}".format(size, array))
return num_comparisons
elif len(args) == 3 and args[1] == "<":
a, b = int(args[0]), int(args[2])
print(int(array[a] < array[b]), file=pipe.stdin); pipe.stdin.flush()
num_comparisons += 1
else:
raise RuntimeError("unknown command")
random.seed(0)
total = 0
for i in range(101):
num_comparisons = sort_test(i)
print(i, num_comparisons)
total += num_comparisons
print("total", total)
プログラムを採点するには、と入力しますpython score.py yourprogram
。スコアリングは、プログラムに各サイズ0から100のランダム配列を1つソートさせ、プログラムが要求する比較の量をカウントすることによって行われます。これらのランダムな配列は重複する可能性があり、アルゴリズムは等しい要素を処理できる必要があります。重複がある場合、等しい要素の順序に関する要件はありません。したがって、配列の場合は、または[0, 0]
を出力しても問題ありません。a 0 1
a 1 0
スコアリングプログラムが生成する特定の配列に合わせて最適化することはできません。RNGシードはいつでも変更できます。組み込みのソートアルゴリズムを使用した回答は、興味を引くために投稿することが許可されていますが、競合するものではありません。
最もスコアの低いプログラムが勝利します。