¿ Resolver Sudoku es demasiado difícil? ¿Incluso la versión de fuerza bruta ? Aquí hay un ejercicio de codificación que es un poco más fácil. Espero. :-PAGS
Escriba la función más corta para implementar bogosort. En concreto, su función debería:
- Tome una matriz (o el equivalente de su idioma) como entrada
- Verifique si sus elementos están ordenados; si es así, devuelve la matriz
- Si no, baraja los elementos y comienza de nuevo
La entrada más corta gana. En el caso de un empate, se favorece una función que admita un comparador personalizado (y / o un generador de números pseudoaleatorios). Cualquier vínculo restante se resuelve favoreciendo la presentación anterior.
Aclaraciones: puede usar cualquier tipo de elemento que desee, siempre que haya alguna forma de ordenarlos, por supuesto. Además, la mezcla debe ser uniforme; nada de este asunto de "lo ordenaré rápidamente y lo llamaré barajado" :-)
Respuestas:
APL (Dyalog), 20
Explicación
⍵
es el argumento (correcto)⍵≡⍵[⍋⍵]
: Comprueba si⍵
ordenado es igual a⍵
sí mismo:⍵
: en caso afirmativo, devuelve⍵
∇⍵[?⍨⍴⍵]
: De lo contrario, genera una matriz de 1 a⍴⍵
(longitud de⍵
) en orden aleatorio, reordena de⍵
acuerdo con eso (⍵[...]
) y aplica la función a él (∇
)De repente revisando este problema y ...
APL (Dyalog), 19
Solo pensar en ordenar una matriz en el cheque lo hace algo inútil (sin decir que Bogosort es significativo), sería una implementación más precisa
∧/2≤/⍵
, y eso pasa a reducir el recuento de caracteres.fuente
Perl 6: 23 caracteres
fuente
[<=]
comprueba si una lista está ordenada:[<=] (1, 2, 3,) == (1 <= 2 <= 3) == (1 <= 2) and (2 <= 3)
y.pick(n)
elige n elementos aleatorios de una lista, y.pick(*)
permite que Perl elija todos los elementos. use.perl.org/~masak/journal/40459pick
usado antes, y mucho menos[<=]
. ¿En qué parte de la documentación están esos?[]
es reducir operador que lleva al operador entre corchetes. Por ejemplo,[<=] 1, 2, 3
es1 <= 2 <= 3
(y sí, haces rangos como este en Perl 6). En este caso, se usa para determinar si los elementos están en orden..pick(*)
El método baraja la lista (pick(N)
seleccionaN
elementos de la lista)..=
llama al método y asigna el resultado a la variable. En cuanto a la documentación, bueno, por ahora solo existe la especificación Perl 6: feather.perl6.nl/syn , pero existe.APL (22)
Uso:
Explicación:
⍋⍵
: devuelve los índices de los elementos en orden, por lo que⍋30 10 20
da2 1 3
(⍳X←⍴⍵)≡⍋⍵:⍵
Almacene la longitud de la lista de entrada en X. Si el rango[1..X]
es igual al orden de índice ordenado, la lista se ordena, así que devuélvala.⋄∇⍵[X?X]
: si este no es el caso, recurse con una matriz aleatoria.fuente
Ruby - 33 caracteres
fuente
g=proc{|l|0until l.sort==l.shuffle!}
f=->l{l.sort!=l.shuffle!?redo:l}
(Ruby 1.9)redo
funciona con unproc
método clásico pero no condef...end
? Pensé queredo
solo funciona con bucles?redo
[...] transfiere el control al principio del proceso o lambda". Simplemente es así.Mathematica ,
4037Con espacios en blanco:
fuente
#//.l_/;Sort@l!=l:>RandomSample@l&
J -
3427p.ej:
La parte {~? ~ @ # Baraja la entrada:
fuente
Python 61
Se ordena en su lugar.
fuente
from random import*
puede guardar un char.Python 94
Otras respuestas de Python usan random.shuffle (). La documentación del módulo aleatorio python establece:
fuente
return[x...
lo contrarioreturn [x...
. Lo mismo conpermutations(a) if
- podría serpermutations(a)if
.lambda a: [x for x in __import__("itertools").permutations(a) if x==tuple(sorted(a))][0]
es 88 bytesK,
3125{while[~x~x@<x;x:x@(-#x)?#x];x}
.
.
fuente
Python (69 caracteres)
Ordena enteros en orden numérico creciente. Tenga en cuenta que las soluciones recursivas, como
from random import*;f=lambda a:a>sorted(a)and(shuffle(a)or f(a))or a
fallará debido al desbordamiento de la pila incluso para entradas pequeñas (digamos N> 5), porque Python no hace la optimización de llamadas de cola.
fuente
D sin comparador personalizado: 59 caracteres
Más legible:
D con comparador personalizado: 69 caracteres
Más legible:
fuente
Scala 73:
En Scala, podemos verificar si el compilador hizo una optimización de cola:
Y sí, lo hizo. Sin embargo, para una lista corta de 100 valores:
tardó casi 4 meses en completarse. ;)
fuente
C # (184 caracteres)
No es realmente bueno hacer esto en C #. Debe admitir genéricos para admitir tanto los tipos de valor como los de referencia. No hay una función de arrastre aleatorio o función para verificar si algo está ordenado.
¿Alguien tiene algún consejo para mejorar esto?
Editar versión que solo clasifica int (134 caracteres):
fuente
GNU / BASH 65
fuente
C ++ 11, 150 caracteres
Solo ... hecho por diversión.
fuente
Python - 61 caracteres
Recursivo
fuente
from random import*
podría ser más cortoPowerShell ,
8582565552 bytes-26 bytes gracias a las sugerencias de mazzy
-1 byte gracias a AdmBorkBork
-3 bytes gracias a mazzy
Pruébalo en línea!
PowerShell tiene una comparación de matriz relativamente barata al convertirlos en cadenas y comparar eso.
fuente
param
inicialización a sufor
inicialización para guardar un byte -for($l=$args;
-ne
convierte el operador derecho en un tipo escalar del operador izquierdo. por lo tanto, puede guardar algunos bytes: ¡ Pruébelo en línea!Javascript 291 caracteres
min
un-min
fuente
var
mensajes. Simplemente conviértalos en globales implícitos, se trata de hacer que el código sea lo más breve posible.Matlab, 59 bytes
Enfoque relativamente sencillo:
fuente
J, 22 bytes
Esta es una mónada recursiva y tácita que usa una agenda. Así es como funciona:
Deja que
y
sea nuestra lista. Primero, el verbo a la derecha de la agenda es-:/:~
. Este es un verbo proporcionado gentilmente por Leaky Nun . Coincide (-:
) si la entrada está ordenada o no (/:~
) usando un gancho monádico. ((f g) y = y f (g y)
) Esto devuelve uno o cero en consecuencia. El lado izquierdo de la agenda es un gerundio de dos verbos: a la derecha está el verbo de identidad]
, y a la izquierda es donde tiene lugar la recursión. La agenda selecciona el verbo de identidad en la posición1
si la lista está ordenada y el verbo más largo en la posición0
si la lista no está ordenada.$:@({~?~@#)
llamadas$:
(el verbo más largo que contiene) encima del resultado de{~?~@#
ony
. Esto baraja la lista, ya que?~@#
toma las permutaciones de la longitud de losy
índices, que se ordenan aleatoriamentey
.{~
, en un gancho monádico, devuelve una lista dey
cuyos índices son el argumento correcto. Esta lista aleatoria se vuelve a llamar con la agenda y se repite hasta que se ordena.fuente
C ++ 14, 158 bytes
fuente
Jelly , 6 bytes, desafío de postdates de idioma
Pruébalo en línea!
Explicación
Œ¿
asigna un número a cada permutación de una lista; 1 está ordenado, 2 tiene los dos últimos elementos intercambiados, etc., hasta el factorial de la longitud de la lista (que es la lista en orden inverso). Por lo tanto, para una lista ordenada, tiene el valor 1, y podemos disminuirla usando’
para producir una prueba "no ordenada" que se pueda usar como booleana en una condición de bucle while. El$
es hacer que la condición se analice como un grupo.fuente
C ++, 166 bytes
Meh
Esto debería funcionar en todos los contenedores STL que tienen
begin()
yend()
.Sin golf:
fuente
APL (Dyalog Extended) , 15 bytes
Pruébalo en línea!
fuente
?⍨∘≢⍛⊇⍨⍣{⍺≡∧⍺}
Brachylog , 5 bytes
Pruébalo en línea!
Cuando vi por primera vez la respuesta de Brachylog de ais523 (a diferencia de su respuesta de Jelly, porque si no me equivoco, el usuario62131 también era él), me preguntaba, ¿qué pasaría si usara retroceso en lugar de recursión? Así que al principio lo intenté
ṣ≤₁
. Resulta que, dado que elegir algo al azar no produce múltiples salidas, sino que solo produce una salida de forma no determinista, el predicado aleatorioṣ
no se puede rastrear, por lo que ejecutarlo simplemente fallará a menos que tenga la suerte de mezclarlo correctamente en el primer intento. Después de eso, lo intentépṣ≤₁
, lo que funcionó la mayor parte del tiempo, pero dado que una lista finitamente larga tiene muchas permutaciones, a veces todavía falla al azar. Después de haber abandonado el objetivo de lograr la reducción de longitud, finalmente se me ocurrió esto:(Demostración de aleatoriedad)
Aunque en realidad puede ser un poco más corto si nos tomamos algunas libertades con E / S ...
Brachylog , 4 bytes
Pruébalo en línea!
Para que la salida sea útil, la entrada no debe contener elementos duplicados, porque además de ordenar la entrada, este predicado bogosort agrega un número aleatorio de elementos duplicados y ceros. (Hipotéticamente, podría agregar cualquier cosa, pero simplemente no lo hace). Por lo general, no me molestaría en mencionar algo que está lejos de funcionar correctamente, pero siento que está en el espíritu del desafío.
fuente
Perl 6 , 28 bytes
Pruébalo en línea!
Bloque de código anónimo que baraja la lista hasta que se ordena. Tenga en cuenta que ordena la lista al menos una vez, lo cual está permitido. Y no,
{.pick(*)}
no se puede reemplazar con*.pick(*)
fuente
Pyth , 11 bytes
Bastante contento con esto, probablemente se pueda jugar un poco más al golf
Explicación
Pruébalo en línea!
fuente
=Q.SQ
a=.SQ
-1 byte (también funciona con otros operadores, como=QhQ
->=hQ
)Japt ,
119 bytesIntentalo
fuente
Brachylog (v2), 5 bytes
Pruébalo en línea!
Presentación de funciones. (El enlace TIO utiliza un argumento de línea de comandos que envuelve automáticamente una función en un programa completo).
Explicación
Prolog (el lenguaje en el que se compila Brachylog) es recursivo en la cola, por lo que esta función termina siendo compilada en un ciclo cerrado.
fuente
C (203 caracteres, sin bucle de entrada: solo el func)
Esto es lo mismo que lo siguiente, donde también leemos la matriz de stdin y escribimos la matriz ordenada. Dado que la Q solicitó la función y no un programa completo ...
C (296 caracteres)
La compilación puede dar advertencia (declaraciones implícitas). Límite de tamaño de matriz codificada de 999 elementos. Frágil.
Si no es necesario verificar previamente si la matriz está ordenada, se puede hacer en 284.
C (251 caracteres, era 284)
(usando globales en lugar de argumentos de función).
fuente