Implementar Tyrant Sort [cerrado]

8

TL; DR

  • Registro (izquierda-derecha) / longitud para cada par de elementos consecutivos. Si son 0 o negativos, no lo grabe.
  • Una vez hecho esto, tome estas medidas. No actualice los cocientes:
    • Incremento a la derecha y decremento a la izquierda para (0, .3)
    • Eliminar de la matriz en> =. 3
    • Imprima ambos elementos para> .5
  • Imprime la matriz restante. Tener un separador para ejecutar y restante.

Ahora, en el desafío ...

Este es el algoritmo de ordenación que tiene un peor caso de GLORIOSO tiempo lineal , y donde cualquiera que se atreve a oponerse a su infinita sabiduría será rápidamente EJECUTADO por su atroz crimen de alta traición .

The FEARLESS LEADER le ha encomendado la MISIÓN HONORABLE de escribir un programa o función que tome una serie de enteros y los clasifique utilizando el siguiente algoritmo de clasificación:

  1. Iterar a través de la matriz, que alumbra cada elemento con el GLORIOSO presencia de su líder audaz .
  2. Haga que su POLICÍA SECRETA verifique cada par de 2 elementos consecutivos para asegurarse de que sean CORRECTAMENTE LEALES A SU NACIÓN . Si no están ordenados correctamente, registre la diferencia entre los números, dividida por la longitud de la matriz. Este es su cociente disidente.
  3. Al final de su GLORIOSO TOUR , revise la lista y LLEGUE EL DIVINO CASTIGO DEL LÍDER IMPERMEABLE en todos los DISIDENTES TREASONOS de la siguiente manera:
    • Para un cociente disidente de menos de .3, simplemente necesitan un lavado de cerebro como recordatorio de la GLORIA INFINITA DEL LÍDER SIN MIEDO . Disminuya el elemento izquierdo e incremente el elemento derecho. No cambie ningún cociente disidente.
    • Para un cociente disidente de .3-.5 (inclusive), son TRAIDORES y deben enviarse a CAMPAMENTOS DE PRISIÓN . Eliminarlos de la matriz.
    • Para un cociente disidente mayor que .5, son ESCORRIDAS REBELDE ODIOSAS . Deben EJECUTARSE PÚBLICAMENTE como un ejemplo para cualquier otro HERETIS TREASONO con el que se hayan aliado. Elimínelos de la matriz y envíelos a la fuente nacional de noticias, The STDOUT Times.
  4. Su matriz ahora está COMPLETAMENTE Y SIEMPRE ordenada. Envíalo a The STDOUT Times para que puedan cantar tu GLORIOSA VICTORIA .

Como VISIÓN OBLIGATORIA para aquellos que son demasiado TONOS como para comprender la GLORIA INFINITA de este algoritmo, se usará para ordenar la siguiente matriz:

[1,8,6,0,4,9,3,5,7,2]
  • 1 y 8 están ordenados correctamente.
  • 8 y 6 no están ordenados correctamente, por lo que el cociente disidente de .2 se registra para ambos.
  • 6 y 0 son otro par de disidentes. Este cociente disidente es .6.
  • 0 y 4 están ordenados correctamente.
  • 4 y 9 están ordenados correctamente.
  • 9 y 3 tienen un cociente disidente de .6.
  • 3 y 5 están ordenados correctamente.
  • 5 y 7 están ordenados correctamente.
  • 7 y 2 tienen un cociente disidente de .5.

Entonces, tomas las siguientes acciones en nombre del LÍDER SIN MIEDO :

  • Disminuya de 8 a 7 e incremente de 6 a 7.
  • Eliminar 0 y el nuevo 7, y EJECUTARLOS .
  • Sigue con 9 y 3.
  • Lleva los 7 y los 2 originales a los campos de reeducación y retíralos.

Este debería ser su comunicado de prensa, hecho en STDOUT o lo que sea conveniente:

Executions: 7, 0, 9, 3
[1, 7, 4, 5]

Como puede ver, la matriz resultante está COMPLETAMENTE Y SIEMPRE CLASIFICADA . Intentar sugerir que no está ordenado constituye ALTA TREASON .

Ahora, como una GLORIOSA DEMOSTRACIÓN de los RECURSOS INTERMITENTES proporcionados por el LÍDER SIN MIEDO , él le ha proporcionado su SABIDURÍA INFINITA para generar casos de prueba:

import random

len=random.randint(2,20)
arr=list(range(len))
random.shuffle(arr)
print(arr)

dissent=[(arr[i]-arr[i+1])/len for i in range(len-1)]
dissent.append(0) # Barrier between front and back of the array.
executions=[]
for i in range(len-1):
    if dissent[i] > 0:
        if dissent[i] < 0.3:
            arr[i] -= 1
            arr[i+1] += 1
        elif dissent[i] > 0.5:
            if dissent[i-1] <= 0.5:
                executions.append(arr[i])
            executions.append(arr[i+1])

print([arr[i] for i in range(len) if dissent[i] < 0.3 and dissent[i-1] < 0.3])
print(executions)

Pruébelo en línea : presione el botón Ejecutar para usarlo; de lo contrario, obtendrá lo que obtuvo la última persona.

En aras de stare desecis, FEADLESS LEADER también ha proporcionado un ejemplo de caso límite:

Input                  Output
3,2,1,4,4,1,2,3,4,5    2,2,2,4,2,3,4,5

(No hay ejecuciones en este ejemplo).

Finalmente, debe tratar los bytes en su programa como partidarios clave y minimizarlos. El programa más corto en bytes ganará el FAVOR ETERNO DEL LÍDER SIN MIEDO .

Crédito donde es debido

El concepto para esto se inspiró en Lazy Drop Sort , y el estilo de escritura utilizado fue tomado en gran parte de las Dictaduras psicóticas. Visítelos si disfrutó el aspecto de parodia de esto.

El crédito adicional es para todos los que votaron sobre esto en el Sandbox desde el principio. El +8 que alcanzó fue mi motivación para reescribirlo para evitar duplicaciones.

Nissa
fuente
Los comentarios no son para discusión extendida; Esta conversación se ha movido al chat .
Mego
Esto necesita una gran renovación. Más sobre qué hacer y menos sobre historias. Qué piensas ?
Muhammad Salman
@MuhammadSalman como con la primera vez que esto se cerró, realmente me gustaría saber qué falta en el resumen.
Nissa
@StephenLeppik: No falta nada en el resumen (estoy bastante seguro) pero, como dije, menos historias y más datos concretos sobre lo que hay que hacer. Al menos esa es la razón por la que voté para que se suspendiera. Otros pueden tener diferentes razones.
Muhammad Salman el
+1 por la idea interesante. -1 para el estilo de escritura innecesario sobre la parte superior. Las historias interesantes, aunque no soy fanático de ellas, pueden estar bien si no restan valor al desafío, pero tuve que releer el desafío 3 veces (incluso con los ejemplos) para asegurarme de que no me perdiera nada . También en tu tl; dr, te estás perdiendo el punto que dice si izquierda <derecha, entonces disentir = 0. Además, estoy bastante seguro de que quieres decir izquierda menos derecha, no derecha menos izquierda, ya que eso siempre sería negativo si la derecha es menor que la izquierda .
PunPun1000

Respuestas:

2

Ruby , 146135 bytes

->l{e=[];i=0;l.inject{|j,k|q=(j-k)*10.0/l.size;b,c=l[i],l[i+=1];q>5&&e<<b<<c;q>0&&(l[i-1],l[i]=q<3?[b&&b-1,c&&c+1]:p);k};[l-a=[a],e-a]}

Pruébalo en línea!

Asone Tuhid
fuente