Introducción
Este desafío se trata de tres (malos) algoritmos de clasificación: Bogosort
y otras dos variantes que se me ocurrieron (pero probablemente otros han pensado en algún momento): Bogoswap
(AKA Bozosort) y Bogosmart
.
Bogosort
funciona barajando completamente la matriz al azar y verificando si se ordena (ascendente). Si no, repite.
Bogoswap
funciona seleccionando dos elementos, aleatoriamente, e intercambiándolos. Repita hasta que esté ordenado (ascendente).
Bogosmart
funciona seleccionando dos elementos, aleatoriamente, y solo intercambiándolos si hace que la matriz esté más cerca de ser ordenada (ascendente), es decir. si el elemento con el índice más bajo era originalmente más grande que el que tenía el índice más alto. Repita hasta que esté ordenado.
El reto
Este desafío explora la eficiencia (o falta de) de cada uno de estos tres algoritmos de clasificación. El código de golf será
generar una matriz aleatoria de 8 elementos de los enteros 1-8 inclusive (sigue leyendo para ver cómo debes hacer esto);
aplicar cada algoritmo a esta matriz; y
muestra la matriz original, seguida del número de cálculos necesarios para cada algoritmo, separados por un espacio (espacio final, ok), en el formato
<ARRAY> <BOGOSORT> <BOGOSWAP> <BOGOSMART>
.
El programa producirá 10 casos de prueba; puede generar los diez al principio o generar uno a la vez, lo que sea. Ejemplo de salida a continuación.
Detalles:
Para Bogosort
, debe registrar el número de veces que se barajó la matriz.
Para Bogoswap
, debe registrar el número de intercambios realizados.
Para Bogosmart
, debe registrar el número de intercambios realizados.
Salida de ejemplo:
87654321 1000000 100 1
37485612 9050000 9000 10
12345678 0 0 0
28746351 4344 5009 5
18437256 10000 523 25
15438762 10000 223 34
18763524 58924 23524 5
34652817 9283 21 445
78634512 5748 234 13
24567351 577 24 34
Yo inventé estos números; por supuesto, su programa imprimirá diferentes resultados pero en el mismo formato.
Reglas
- Toda aleatoriedad utilizada en su programa debe provenir de generadores de números pseudoaleatorios disponibles para usted, y de lo contrario no deben ser ampliamente calculados por usted. No tienes que preocuparte por las semillas.
- No hay límite de tiempo en los programas.
- Las matrices se deben clasificar de forma ascendente.
- Los espacios finales o una nueva línea adicional no son gran cosa.
- Para
Bogosort
, la matriz se baraja utilizando cualquier algoritmo de barajado imparcial como Fisher-Yates o Knuth Shuffling , especificado explícitamente en su explicación. Los métodos de barajado integrados no están permitidos. Genere sus matrices de prueba de la misma manera. - Si después de barajar o cambiar la matriz sigue siendo la misma, todavía cuenta y debe incluirse en la cuenta del programa. Por ejemplo, barajar la matriz a sí mismo por coincidencia cuenta como una combinación aleatoria, e intercambiar un elemento consigo mismo cuenta como un intercambio, aunque ninguna de estas operaciones cambie la matriz.
- Si mi memoria me sirve correctamente, una matriz de 8 elementos no debería llevar mucho tiempo para ninguno de los tres algoritmos. De hecho, creo que algunas veces para una matriz de 10 elementos, cuando lo probé,
Bogoswap
solo requería unos pocos miles (o menos) de barajaduras reales y bastante menos de 10 segundos. - Su código debe ordenar los arreglos, no solo dé los valores esperados o los cálculos matemáticos para una respuesta esperada.
- Este es un desafío de código de golf, por lo que gana el programa más corto en bytes.
Aquí hay algunos pasos de muestra para cada algoritmo de clasificación:
BOGOSORT
56781234
37485612
28471653
46758123
46758123
12685734
27836451
12345678
BOGOSWAP
56781234
16785234
17685234
12685734
12685743
12685734
12485763
12385764
12385764
12345768
12345678
BOGOSMART
56781234
16785234
12785634
12785364
12785364
12385764
12385674
12345678
En este caso, el programa saldría 56781234 7 10 7
y luego haría lo mismo 10 veces. No tiene que imprimir las matrices mientras se realiza la clasificación, pero le di los pasos de muestra anteriores para que pueda comprender cómo funciona cada algoritmo y cómo contar los cálculos.
Respuestas:
Pyth,
6260 bytesEsto fue muy divertido. No estoy seguro de si esto es válido, probablemente estoy usando algunas lagunas no escritas.
Una salida de muestra sería:
Explicación:
Mi función aleatoria utiliza la función incorporada
order-by
. Básicamente, asigno a cada elemento de la lista un número aleatorio del intervalo[0-1)
y clasifico la lista por ellos. Esto me da una mezcla aleatoria imparcial.Bucle exterior
Al
VT
principio repite el siguiente código 10 veces.Preparación
Bogosort
Bogoswap
Bogosmart
Impresión
fuente
=JXJO.cJ2)
es lo mismo que=XJO.cJ2)
- asignación aumentada. Lo mismo vale para=bXb
más tarde. Además, creo que se supone que los swaps tienen los pares elegidos con reemplazo (.C
).c
o.C
no. Por ejemplo.C[3 1 2)2
, no devuelve el par[2, 1]
. Lo cual es una propiedad que estoy explotando en mi algoritmo.*JJ
entonces? También es un personaje más corto, lo cual es bueno.JavaScript ( ES6 ), 319
345Como era de esperar, esto es bastante largo.
Para aleatorio aleatorio, créditos a @ core1024 (mejor que el mío para el mismo chellenge)
Pruebe a ejecutar el fragmento (Firefox solo como de costumbre)
fuente