Hier ist ein ziemlich verbreitetes Muster für Sortieralgorithmen:
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]
Diese Algorithmen funktionieren gut, da die Indizes i
und j
anhand des Status der Liste sorgfältig ausgewählt werden l
.
Was aber, wenn wir nicht sehen l
konnten und einfach blind wählen mussten? Wie schnell könnten wir dann die Liste sortieren?
Ihre Herausforderung besteht darin, eine Funktion zu schreiben, die ein zufälliges Indexpaar mit der angegebenen Länge von ausgibt l
. Insbesondere müssen Sie zwei Indizes ausgeben i, j
, mit 0 <= i < j < len(l)
. Ihre Funktion sollte auf jeder Länge der Liste funktionieren, sie wird jedoch auf einer Liste mit einer Länge von 100 bewertet.
Ihre Punktzahl ist die mittlere Anzahl von Indexauswahlmöglichkeiten, die erforderlich sind, um eine gleichmäßig zufällig gemischte Liste nach dem oben genannten Muster zu sortieren, wobei die Indizes gemäß Ihrer Funktion ausgewählt werden.
Ich werde Einsendungen bewerten und dabei die mittlere Anzahl der Indexauswahl über 1000 Versuche auf einer gleichmäßig zufällig gemischten Liste mit einer Länge von 100 ohne wiederholte Einträge verwenden.
Ich behalte mir das Recht vor, weniger Tests durchzuführen, wenn die Einsendung eindeutig nicht wettbewerbsfähig ist oder nicht beendet wird, und ich werde mehr Tests durchführen, um die besten Konkurrenten zu differenzieren und einen einzigen Gewinner zu finden. Wenn mehrere Top-Einreichungen innerhalb der Fehlergrenze meiner Rechenressourcen verbleiben, erkläre ich die frühere Einreichung zum Gewinner, bis weitere Rechenressourcen zur Geltung gebracht werden können.
Hier ist ein Beispiel für ein Bewertungsprogramm in 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
Ihre Funktion behält möglicherweise keinen veränderlichen Status bei, interagiert nicht mit globalen Variablen, wirkt sich auf die Liste l
usw. aus. Die einzige Eingabe Ihrer Funktion muss die Länge der Liste sein l
und ein geordnetes Paar von Ganzzahlen im Bereich [0, len(l)-1]
(oder passend für Ihre Sprache) ausgeben Indexierung der Liste). Fühlen Sie sich frei zu fragen, ob etwas in den Kommentaren erlaubt ist.
Die Beiträge können in einer beliebigen Sprache eingereicht werden. Bitte legen Sie ein Bewertungsgeschirr bei, falls noch keines für Ihre Sprache veröffentlicht wurde. Sie können eine vorläufige Punktzahl veröffentlichen, aber ich werde einen Kommentar mit der offiziellen Punktzahl hinterlassen.
Die Bewertung ist die mittlere Anzahl von Schritten zu einer sortierten Liste auf einer gleichmäßig zufällig gemischten Liste mit einer Länge von 100. Viel Glück.