Trong thử thách tối ưu hóa này, bạn sẽ viết một chương trình sắp xếp một mảng duy nhất bằng cách chỉ so sánh các phần tử thông qua việc yêu cầu người dùng trên thiết bị xuất chuẩn với kết quả so sánh đầu vào trên stdin.
Giao thức dưới đây dựa trên dòng, vì vậy mỗi khi bạn in ra thiết bị xuất chuẩn hoặc đọc từ stdin, nó được giả sử là một dòng mới theo sau. Trong suốt câu hỏi dưới đây, người dùng (đọc: chương trình chấm điểm) có một mảng mà nó muốn được sắp xếp trong một mảng được lập chỉ mục dựa trên 0 được gọi array
. Vì lý do kỹ thuật, tôi khuyên bạn nên xả nước sau mỗi lần in.
- Bước đầu tiên, chương trình của bạn phải đọc kích thước mảng
n
từ stdin. - Sau đó, như bạn muốn, bạn có thể in
a < b
ra thiết bị xuất chuẩn, với hai số nguyên0 <= a, b < n
. Sau đó, người dùng sẽ nhập1
vào stdin nếuarray[a] < array[b]
, và0
nếu không. Cuối cùng, một khi chương trình của bạn bị thuyết phục, nó đã suy ra chính xác thứ tự của mảng, nó phải in
a ...
ra thiết bị xuất chuẩn, trong đó...
một danh sách các số nguyên được phân tách bằng dấu cách chỉ ra thứ tự. Vì vậy, nếu chương trình của bạn xuất ra,a 3 0 1 4 2
điều đó có nghĩa là chương trình của bạn đã suy raarray[3] <= array[0] <= array[1] <= array[4] <= array[2]
Lưu ý rằng chương trình của bạn không bao giờ biết nội dung
array
và sẽ không bao giờ.
Bạn chỉ có thể yêu cầu <
trên stdin để sắp xếp mảng. Bạn có thể có được các hoạt động so sánh khác bằng các tương đương sau:
a > b b < a
a <= b !(b < a)
a >= b !(a < b)
a != b (a < b) || (b < a)
a == b !(a < b) && !(b < a)
Cuối cùng, vì chương trình của bạn tương tác với chương trình chấm điểm trên thiết bị xuất chuẩn, hãy in thông tin gỡ lỗi sang thiết bị lỗi chuẩn.
Chương trình của bạn sẽ được ghi bằng chương trình Python sau:
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)
Bạn ghi điểm chương trình của bạn bằng cách gõ python score.py yourprogram
. Việc chấm điểm được thực hiện bằng cách yêu cầu chương trình của bạn sắp xếp một mảng ngẫu nhiên có kích thước từ 0 đến 100 và tính số lượng so sánh mà chương trình của bạn yêu cầu. Các mảng ngẫu nhiên này có thể có các bản sao , thuật toán của bạn phải có khả năng xử lý các phần tử bằng nhau. Trong trường hợp có các bản sao, không có yêu cầu về thứ tự của các phần tử bằng nhau. Vì vậy, nếu mảng là [0, 0]
không quan trọng nếu bạn xuất a 0 1
hoặc a 1 0
.
Bạn không thể tối ưu hóa cụ thể cho các mảng cụ thể mà chương trình tính điểm tạo ra. Tôi có thể thay đổi hạt giống RNG bất cứ lúc nào. Câu trả lời sử dụng thuật toán sắp xếp tích hợp được phép đăng lên vì lợi ích, nhưng không cạnh tranh.
Chương trình có số điểm thấp nhất sẽ thắng.