Sleep Sort es un algoritmo de clasificación de enteros que encontré en Internet. Abre una secuencia de salida y, para cada número de entrada en paralelo, demora los segundos y emite ese número. Debido a los retrasos, el número más alto se emitirá en último lugar. Estimo que tiene O (n + m), donde n es el número de elementos ym es el número más alto.
Aquí está el código original en Bash
#!/bin/bash
function f() {
sleep "$1"
echo "$1"
}
while [ -n "$1" ]
do
f "$1" &
shift
done
wait
Aquí está el pseudocódigo
sleepsort(xs)
output = []
fork
for parallel x in xs:
sleep for x seconds
append x to output
wait until length(output) == length(xs)
return output
Su tarea es implementar Sleep Sort como una función en el lenguaje de programación que elija. Puede descuidar cualquier factor de concurrencia, como las condiciones de la carrera, y nunca bloquear los recursos compartidos. El código más corto gana. La definición de la función cuenta para la longitud del código.
La lista de entrada se limita solo a enteros no negativos, y se espera que la longitud de la lista de entrada sea razonablemente larga (pruebe al menos 10 números) para que las condiciones de carrera nunca ocurran. y suponiendo que las condiciones de carrera nunca sucedan.
Respuestas:
Una especie de cojo intento de Perl ,
5955523832 caracteres :map{fork||exit print sleep$_}@a
Barebones: 25 Personajes:
... si no le importan los resultados de clasificación como salida de matriz:
map{fork||die sleep$_}@a
Con todos los adornos:
(para cumplimiento de desafío máximo, 44 caracteres)
sub t{map{fork||exit print sleep$_}@_;wait}
Si dejas que Perl te espere, 39 caracteres:
sub t{map{fork||exit print sleep$_}@_}
Y de nuevo, si no te importa
die()
, 32 caracteres ...sub t{map{fork||die sleep$_}@_}
Tenga en cuenta que en Perl 6, o cuando se declara la función 'decir', es posible reemplazar la
print
función consay
, guardando un carácter en cada instancia. Obviamente, dado quedie
ambos finalizan el proceso bifurcado y escriben la salida, sigue siendo la solución más corta.fuente
perl-E
para habilitar características 5.010 comosay
(fork&&die sleep$_)for@a
funciona tambiénC , 127 caracteres, una solución bastante obvia:
(Compilado
gcc -std=c99 -fopenmp sort.c
e ignorando todas las advertencias).fuente
for(;c>=0;--c){int x=atoi(v[c]);
. No estoy seguro si eso está permitido.Ruby 1.9, 32 caracteres
Como una función:
Si solo podemos usar una variable predefinida, se reduce a 25 caracteres:
fuente
Thread.new{p sleep i}
para imprimir la salida.JavaScript , 65 caracteres (dependiendo de si usa
console.log
u otra cosa para generar el resultado)Esto supone que
a
es una matriz de enteros no negativos y quemap()
existe en el prototipo de matriz (JavaScript 1.6+).fuente
1e3
en su lugar.alert
es la salida de bloqueo de JavaScript,prompt
es la entrada de bloqueo de JavaScript yconfirm
es la entrada binaria de bloqueo de JavaScript. Si JS se escribiera en la línea de comando, esas serían las llamadas que usaría.APL (
1513)Que hace:
fuente
⎕DL
función que es dormir.Cuatro intentos en Erlang:
Salida a la consola, se han tomado la libertad de hacer esto cada
9ms * Number
vez que esto es suficiente para que funcione (probado en una placa integrada Atom = lenta):Necesita 60 caracteres
La salida a la consola es total sin Erlangish, por lo que enviamos un mensaje para procesar en su
P
lugar:Necesita 55 caracteres
El envío después de un tiempo también se puede hacer de manera diferente (esto incluso funciona con
1ms * Number
):Necesita 41 caracteres
En realidad, esto es un poco injusto ya que la función incorporada
send_after
es un retraso y necesita el espacio de nombre conerlang:
prefijo, si consideramos que este espacio de nombre es importado (hecho a nivel de módulo):Necesita 34 caracteres
fuente
C # - 137 caracteres
Aquí hay una respuesta en C # (actualizada con grados de paralelismo como se comentó)
fuente
WithDegreeOfParallelism
para que esto funcione, de manera análoga alnum_threads
código C de OpenMP.void m(int[] l){foreach(var i in l){var t=new Thread(()=>{Thread.Sleep(int.Parse(s));Console.Write(s);});t.Start();}}}
Python - 81
93148150153Ajustando el código de @ BiggAl, ya que ese es el juego que estamos jugando ...
... o 97
175con inicio retrasado del hiloToma entrada a través de la línea de comando, ala
Al igual que con muchos campos de golf de Python, llega un punto en el que el código es lo suficientemente compacto como para que las variables de alias para acortar los nombres ni siquiera guarden caracteres.
Sin embargo, este es funky porque alias sys y enhebrar AMBOS como t, por lo que sys.argv se convierte en t.argv. Más corto que el de foo import *, ¡y un ahorro neto de caracteres! Sin embargo, supongo que a Guido no le agradaría ...
Nota para el autoaprendizaje c y dejar de jugar golf en python.¡VACA SANTA ESTO ES MÁS PEQUEÑO QUE LA SOLUCIÓN C!fuente
daemon
no necesita configuración a menos que esté comenzando esto como un demonio, y es más corto usar argumentos posicionales, esp. si aliasNone
aN
j
parece terminar siendoFalse
un efecto secundario de tratar de hacer demasiado en una línea.as t,s
y luego cambiar a utilizars
parasys
print
función en lugar desys.stdout.write
?Por diversión, aquí hay una versión de ColdFusion (8+) ;-) Tiene 109 caracteres sin contar los ajustes de línea y la sangría que agregué para legibilidad aquí.
Esto supone que
<cfoutput>
está vigente. Se pueden guardar algunos caracteres escribiéndolo todo en una línea.fuente
Java (alias nunca gana en codegolf):
234211187 caracteressin golf:
fuente
throws Throwable
y deshacerse de lacatch
cláusula.Long.parseLong
conLong.valueOf
.public
yfinal
puedes quitarlo;class M{public static void main
puede serinterface M{static void main
(Java 8+);Long.parseLong(a)
puede sernew Long(a)
(resultando en 165 bytes )Javascript - 52 caracteres
fuente
Scala -
4240 caracteres (caso especial)Si tiene un grupo de subprocesos de al menos el tamaño del número de elementos de la lista:
Scala - 72 caracteres (general)
fuente
{}
cuando te quedas en una línea.{}
con una declaración , pero aún la necesita para agrupar las cosas separadas por;
una línea o no. Y puede escribir enunciados de varias líneas sin{}
en algunos casos (si / si no, por ejemplo).()
para una línea. Es una cuestión de gustos, creo. (Realmente no entiendo por qué()
son compatibles cuando los{}
reemplazo. Tal vez para no alienar a los usuarios de Java al instante). Scala es genial, pero definir bloques de código por sangría es claramente superior. (y así, sobreviene la guerra religiosa;))()
para declaraciones individuales. Intente ingresar(1 to 9).map(i => {val j = i+1; i*j})
en REPL y luego vea qué sucede si lo usa(1 to 9).map(i => (val j = i+1; i*j))
.Haskell - 143 caracteres
Esto probablemente podría acortarse si se ingresa en stdin si esa fuera una opción, pero es tarde y de cualquier manera, todavía son 104 caracteres para la función en sí.
fuente
Befunge-98,
3831 bytesSé que este es un viejo desafío, pero recientemente descubrí los lenguajes Sleepsort y 2D, tuve una idea sobre cómo combinarlos y busqué un lugar para publicarlo, así que aquí estamos.
La IP principal lee un número (
&
), luego toca elt
que lo clona: uno avanza en la misma línea y realiza ciclos, leyendo nuevos números y generando nuevos hijos hasta que alcanza EOF que termina la secuencia. Todos los procesos secundarios se atascan en un bucle cerrado (elv
y^
de la tercera columna) hasta que la IP principal termina de leer la entrada y ejecuta la secuencia de comandos'<21p
, lo que coloca el carácter<
en la posición (1,2), sobrescribiendo^
y liberando todo los procesos secundarios, que comienzan a alternar simultáneamente, reduciendo en 1 su número en cada iteración. Como la velocidad de ejecución de diferentes IP se sincroniza en befunge, terminarán (e imprimirán su valor) en orden, ordenando la lista de entrada.fuente
Un poco tarde para la fiesta:
Arce -
9183 caracteresEn 91:
En 83:
(Esto necesita Maple versión 15, y espera que la lista se ordene en L)
fuente
C,
7069 caracteresNo espera a que vuelvan los procesos secundarios, de lo contrario funciona.
fuente
PHP 57 bytes
pcntl_fork () solo está disponible en Linux.
fuente
Golpe (38):
Editar: coma flotante desde stdin, separados por espacios o nuevas líneas.
fuente
Haskell, 90
Espero que esto cumpla con todos los requisitos.
fuente
𝔼𝕊𝕄𝕚𝕟, 11 caracteres / 22 bytes
Try it here (Firefox only).
שĤ⇀ôa
, esto se ve genial.fuente
Solo algunos ajustes de la versión de @rmckenzie:
Python retrasó el inicio del hilo en
155152114108107:Python sin demora en
130128969593:Gestioné algunas optimizaciones más, utilizando en
Timer
lugar deThread
, que tiene una llamada más concisa y eliminó la necesidad de importartime
. El método de inicio de subproceso retrasado se beneficia de la comprensión de la lista, ya que elimina la necesidad de inicializar la lista por separado al inicio, aunque son dos caracteres más largos ("["+"]"+" "-":"
) que el bucle for, por lo que es inútil sin inicio diferido, y debe tener cuidado de usar una lista en lugar de un generador, o en realidad no estás creando los hilos del temporizador hasta que atravieses el generador.¿Alguien más tiene alguna optimización?
El truco con
as
ayuda, pero en 2.7.1 solo puedes importar un módulo en un alias, y después de jugar un poco sobre eso, ni siquieraimport mod1,mod2 as a,b
tienes que hacerloimport mod1 as a, mod2 as b
. Todavía guarda algunos caracteres, pero no es la cura, todo lo que pensé que era ... Y, de hecho, es mejor dejar sys como sys. Sin embargo, el enhebrado de alias todavía ayuda ...fuente
Clojure, 54
(defn s[n](doseq[i n](future(Thread/sleep i)(prn i))))
fuente
defn
(sus corchetes + lista de argumentos: de 54 a 43 caracteres), o usar enfn
lugar dedefn
=> len- = 2, así que diría en clj su 43: DÓxido - 150 bytes
Y es por eso que no codificas golf en Rust, es más detallado que Java;). Depende de la caja externa
crossbeam
, sería aún peor sin ella.Programa de prueba completo:
fuente
Tipo de aburrido, puerto de C #, solo para comenzar con el lenguaje nuevamente:
F # - 90 caracteres
fuente
JavaScript, 74
o 71/65 caracteres con no estándar:
fuente
function(a){a.map(function(v){setTimeout(console.log,v,v)})}
puede haber funcionado en al menos un navegador durante 60 bytes. Por supuesto, en estos días escribirías en sua=>a.map(v=>setTimeout(console.log,v,v))
lugar.Tcl 8.6, 41 caracteres
Tienes que matarlo con
^C
fuente
VB.NET 100 bytes
Debido a que VB.Net requiere lambdas de una sola línea para contener solo una instrucción, este código debe tener varias líneas:
Sin golf:
Sin embargo, no estoy seguro si cuenta las declaraciones de importación en el recuento de bytes porque si no las cuenta, podría escribir esto:
VB.NET 71 bytes
Sin golf:
fuente
Groovy, 47 bytes
Asume que los números se dan en la línea de comando ...
fuente
Mathematica, 34 o 36 bytes
Simplemente agregue la lista que se ordenará al final de este código y evalúe. Si necesita ser una definición de función válida, entonces toma dos bytes adicionales:
fuente
C ++ 11, 229 bytes
Sin golf y uso:
fuente