Ось досить поширена схема сортування алгоритмів:
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
. Зокрема, потрібно вивести два індекси i, j
, з 0 <= i < j < len(l)
. Ваша функція повинна працювати на будь-якій довжині списку, але вона буде зафіксована у списку довжиною 100.
Ваш бал - це середня кількість виборів індексу, необхідних для сортування рівномірно випадкового перетасованого списку відповідно до вищевказаного шаблону, де індекси вибираються відповідно до вашої функції.
Я оціню подання, взявши середню кількість варіантів вибору індексу понад 1000 випробувань у рівномірно випадково перетасованому списку довжиною 100 без повторних записів.
Я залишаю за собою право проводити менше випробувань, якщо подання явно не є конкурентоспроможним або не припиняється, і я проведу більше випробувань, щоб диференціювати найкращих конкурентів, щоб знайти єдиного переможця. Якщо декілька найвищих подань залишаються в межах помилки на межі моїх обчислювальних ресурсів, я оголошу попереднє подання переможцем, поки не зможуть бути виконані подальші обчислювальні ресурси.
Ось приклад програми підрахунку балів на 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. Удачі.