Oto dość powszechny wzór algorytmów sortowania:
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]
Algorytmy te działają dobrze bo indeksów i
i j
są starannie wybrane, na podstawie stanu listy l
.
Co jednak, jeśli nie moglibyśmy zobaczyć l
, a musielibyśmy wybrać na ślepo? Jak szybko moglibyśmy posortować listę?
Twoim wyzwaniem jest napisanie funkcji, która generuje losową parę wskaźników, biorąc pod uwagę tylko długość l
. W szczególności musisz wygenerować dwa wskaźniki i, j
, z 0 <= i < j < len(l)
. Twoja funkcja powinna działać na dowolnej długości listy, ale będzie oceniana na liście o długości 100.
Twój wynik to średnia liczba wyborów indeksu niezbędnych do posortowania losowo losowo losowej listy zgodnie z powyższym wzorem, przy czym wskaźniki są wybierane zgodnie z funkcją.
Ocenię wyniki, biorąc średnią liczbę wyborów indeksu ponad 1000 prób na jednolicie losowo losowanej liście o długości 100 bez powtarzających się wpisów.
Zastrzegam sobie prawo do przeprowadzenia mniejszej liczby prób, jeśli zgłoszenie jest wyraźnie niezgodne z zasadami konkurencji lub nie zakończy się, i przeprowadzę więcej prób, aby wyróżnić najlepszych konkurentów i znaleźć pojedynczego zwycięzcę. Jeśli wiele najlepszych zgłoszeń pozostanie w granicach błędu na granicy moich zasobów obliczeniowych, ogłosimy zwycięzcę wcześniejszego zgłoszenia, dopóki nie zostaną wykorzystane dalsze zasoby obliczeniowe.
Oto przykładowy program oceniania w Pythonie:
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
Twoja funkcja może nie utrzymywać żadnego stanu zmiennego, wchodzić w interakcje ze zmiennymi globalnymi, wpływać na listę l
itp. Jedyną wartością wejściową funkcji musi być długość listy l
i musi ona generować uporządkowaną parę liczb całkowitych z zakresu [0, len(l)-1]
(lub odpowiednią dla twojego języka indeksowanie list). Zapytaj, czy coś jest dozwolone w komentarzach.
Zgłoszenia mogą odbywać się w dowolnym darmowym języku. Dołącz uprząż punktacji, jeśli nie została jeszcze opublikowana w Twoim języku. Możesz opublikować tymczasowy wynik, ale zostawię komentarz z oficjalnym wynikiem.
Punktacja to średnia liczba kroków do posortowanej listy na jednolicie losowo losowanej liście o długości 100. Powodzenia.