Đây là một mẫu khá phổ biến để sắp xếp các thuật toán:
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]
Các thuật toán này hoạt động tốt vì các chỉ số i
và j
được chọn cẩn thận, dựa trên trạng thái của danh sách l
.
Tuy nhiên, điều gì sẽ xảy ra nếu chúng ta không thể nhìn thấy l
và phải chọn một cách mù quáng? Làm thế nào nhanh chóng chúng ta có thể sắp xếp danh sách sau đó?
Thử thách của bạn là viết một hàm tạo ra một cặp chỉ số ngẫu nhiên, chỉ với độ dài là l
. Cụ thể, bạn phải xuất hai chỉ số i, j
, với 0 <= i < j < len(l)
. Chức năng của bạn sẽ hoạt động trên bất kỳ độ dài nào của danh sách, nhưng nó sẽ được ghi vào danh sách có độ dài 100.
Điểm của bạn là số lựa chọn chỉ số trung bình cần thiết để sắp xếp danh sách xáo trộn ngẫu nhiên thống nhất theo mẫu trên, trong đó các chỉ số được chọn theo chức năng của bạn.
Tôi sẽ chấm điểm các bài nộp, lấy số lượng lựa chọn chỉ số trung bình trên 1000 thử nghiệm trên một danh sách được xáo trộn ngẫu nhiên thống nhất có độ dài 100 mà không có mục lặp lại.
Tôi bảo lưu quyền chạy thử nghiệm ít hơn nếu bài nộp rõ ràng không cạnh tranh hoặc không chấm dứt và tôi sẽ chạy nhiều thử nghiệm hơn để phân biệt các đối thủ cạnh tranh hàng đầu để tìm một người chiến thắng. Nếu nhiều lần gửi hàng đầu vẫn nằm trong phạm vi lỗi ở giới hạn tài nguyên tính toán của tôi, tôi sẽ tuyên bố gửi trước đó cho người chiến thắng, cho đến khi có thể mang lại các tài nguyên tính toán tiếp theo.
Đây là một chương trình tính điểm ví dụ, bằng 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
Hàm của bạn có thể không duy trì bất kỳ trạng thái có thể thay đổi nào, tương tác với các biến toàn cục, ảnh hưởng đến danh sách l
, v.v. Đầu vào duy nhất của hàm phải là độ dài của danh sách l
và phải xuất ra một cặp số nguyên theo thứ tự trong phạm vi [0, len(l)-1]
(hoặc phù hợp với ngôn ngữ của bạn liệt kê danh sách). Hãy hỏi xem có gì được cho phép trong các bình luận không.
Đệ trình có thể bằng bất kỳ ngôn ngữ sử dụng miễn phí nào. Vui lòng bao gồm khai thác điểm nếu chưa được đăng cho ngôn ngữ của bạn. Bạn có thể đăng một số điểm tạm thời, nhưng tôi sẽ để lại nhận xét với số điểm chính thức.
Ghi điểm là số bước trung bình của một danh sách được sắp xếp trên danh sách được xáo trộn ngẫu nhiên có độ dài 100. Chúc may mắn.