Aquí hay un patrón bastante común para los algoritmos de clasificació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]
Estos algoritmos funcionan bien porque los índices i
y j
se eligen cuidadosamente, en función del estado de la lista l
.
Sin embargo, ¿qué pasaría si no pudiéramos ver l
y solo tuviéramos que elegir a ciegas? ¿Qué tan rápido podríamos ordenar la lista entonces?
Su desafío es escribir una función que genere un par aleatorio de índices, dada solo la longitud de l
. Específicamente, debe generar dos índices i, j
, con 0 <= i < j < len(l)
. Su función debería funcionar en cualquier longitud de la lista, pero se puntuará en una lista de longitud 100.
Su puntaje es el número medio de opciones de índice necesarias para ordenar una lista aleatoria uniforme de manera aleatoria de acuerdo con el patrón anterior, donde los índices se eligen de acuerdo con su función.
Calificaré las presentaciones, tomando el número medio de opciones de índice de más de 1000 ensayos en una lista aleatoria uniformemente aleatoria de longitud 100 sin entradas repetidas.
Me reservo el derecho de realizar menos pruebas si la presentación es claramente no competitiva o no finaliza, y realizaré más pruebas para diferenciar a los principales competidores para encontrar un único ganador. Si varias presentaciones principales permanecen dentro del margen de error en el límite de mis recursos computacionales, declararé la presentación anterior como ganadora, hasta que se puedan obtener más recursos computacionales.
Aquí hay un ejemplo de programa de puntuación, en 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
Es posible que su función no mantenga ningún estado mutable, interactúe con variables globales, afecte la lista l
, etc. La única entrada de su función debe ser la longitud de la lista l
y debe generar un par ordenado de enteros en el rango [0, len(l)-1]
(o apropiado para el idioma de su idioma). lista de indexación). No dude en preguntar si hay algo permitido en los comentarios.
Los envíos pueden estar en cualquier idioma de uso gratuito. Incluya un arnés de puntuación si aún no ha publicado uno para su idioma. Puede publicar un puntaje provisional, pero dejaré un comentario con el puntaje oficial.
La puntuación es el número medio de pasos para una lista ordenada en una lista aleatoriamente uniforme de longitud 100. Buena suerte.