Tengo un reto para usted:
- Imprime "Hello World" en cualquier idioma.
- Cada personaje debe imprimirse desde su propio hilo único.
Eso es. Obviamente, como no hay garantía de que los subprocesos funcionen en el orden en que los inicia, debe hacer que el subproceso de su programa sea seguro para garantizar que la salida se imprima en el orden correcto.
Y, como se trata de código de golf, gana el programa más corto.
Actualizar:
El ganador es la entrada APL de Marinus , con 34 caracteres. También gana el premio por la entrada menos legible.
HelolW rdlo
Respuestas:
APL (Dyalog) (
44433934)Explicación:
2 11⍴'Hello World',⍳11
crea una matriz: (H, 1), (e, 2), ...&⌿
significa: para cada columna de la matriz, hacer en un hilo separado:⍺
ahora es el personaje y⍵
ahora es el momento⎕DL⊃⍵
espera por⍵
segundos⍞←⍺
genera el carácter.fuente
C,
6162 caracteresTodas las funciones de la biblioteca pthread tienen muuuucho nombres, así que en su lugar, inicié un proceso completamente separado para cada personaje.
fork()
Es mucho más corto.Era necesario usarlo en
write()
lugar deputchar()
porque las funciones de almacenamiento en búfer stdio no son seguras para subprocesos.Editado : Copia de seguridad de hasta 62 caracteres. En mi celo, bajar a 61 caracteres también dejó caer el hilo de seguridad.
fuente
write(1,"Hello World\n",!!++i)
por 2 bytes. Buena solución de lo contrario.!!++i
!!i++
, pero lo edité unos segundos después, porque me di cuenta de que se evaluaría0
en la primera iteración. Asumí que habías visto la versión sin editar. No puedo probar su código, porque solo imprime el primer carácter, una vez . Sin embargo, hay muchas alternativas;i++<13
, usando!!i
, o inclusowrite(1,"Hello World\n",i++>13||fork()||main())
Ruby, 46 caracteres.
Se sincroniza debido al hecho de que el programa espera a que finalice el subproceso antes de comenzar el siguiente subproceso y continuar con el siguiente carácter.
fuente
Pythonect (35 caracteres)
http://www.pythonect.org
fuente
Python (
1019398)Esta es la solución de Peter Taylor. Funciona retrasando la impresión del enésimo carácter en N segundos. Ver comentarios.
Este es el original:
Funcionó porque el tiempo que lleva imprimir un solo carácter es menor que el tiempo que tarda Python en inicializar un nuevo subproceso, por lo tanto, el subproceso N terminaría antes de que se creara el subproceso N + 1. Aparentemente es contrario a las reglas confiar en esto.
fuente
import sys,threading
aimport sys,threading as t
y puede guardar 2 más, pasando los argumentos a Thread como argumentos posicionales, en lugar de argumentos de palabras clave.threading.Timer
lugar dethreading.Thread
. Pasex
como el parámetro de suspensión.for x in range(11):t.Timer(x,sys.stdout.write,"Hello World"[x]).start()
C # 73
fuente
APL (Dyalog Unicode) , SBCS de 28 bytes
Programa completo Imprime en stderr. Inspirado en la solución de marinus .
Pruébalo en línea!
⍳11
primeros 11 enteros'Hello World'{
…}&¨
Para cada entero como argumento derecho (⍵
), genera la siguiente función con el carácter correspondiente como argumento izquierdo (⍺
):⎕DL⍵
d e l segundos de argumento correcto⍺⊣
descartar eso (la demora efectiva) a favor del carácter de argumento izquierdo⍞←
imprima eso en stdout sin salto de línea finalfuente
⍞∘←&¨'dlroW olleH'
? - No sé si se garantiza en teoría, pero parece que siempre se imprima en el orden correcto⍞∘←
no es interrumpible (¿o sí? ¿Tal vez puedas preguntarle a un desarrollador C?). Dyalog implementa hilos verdes: 1 hilo real que finge ser muchos, por lo que si no se puede producir un cambio de hilo (verde), el orden es predecible.Java (160 caracteres)
Sí, sé que este es el lenguaje incorrecto para el golf de código, lo hago por diversión.
fuente
class A{public static void main(String[]args){new B(0).start();}}class B extends Thread{int i;B(int j){i=j;}public void run(){System.out.print("Hello World".charAt(i));if(i<10)new B(i+1).start();}}
-197 caracteresclass A extends Thread{static int i;public static void main(String[]args){System.out.print("Hello World".charAt(i++));if(i<11)new A().start();}public void run(){main(null);}}
- 174 caracteresclass A{static int i;public static void main(String...a){new Thread(){public void run(){System.out.print("Hello World".charAt(i++));if(i<11)main();}}.start();}}
- 160 caracteresGolpe (64)
fuente
:()([ "$1" ]&&(printf "${1:0:1}"&: "${1:1}"));: Hello\ World
Haskell (
120118)No estoy tan seguro de multiplicar por 9999: tengo un Xeon de 2Ghz en el que funcionará bien incluso si no lo haces, pero también tengo un Pentium 4 que lo necesita (999 dio una salida confusa y 99 no No hagas nada en absoluto.)
fuente
(*5^6)
lugar de(*9999)
y sin usar comillas inversas paramapM_
.(((mapM_ (\(x,y) ... )) zip) [0..]) ...
lo que no desea.999
, podría truncarse a 0 debido a limitaciones del sistema operativo, pero podría estar equivocado. ¿Qué sistema operativo estás usando?scala (
8179 caracteres)fuente
Groovy, 51 personajes
fuente
D (135 caracteres)
Solo comienzo el siguiente hilo cuando ya he impreso el carácter actual
editar +2 caracteres para una mejor verificación encuadernada
fuente
[email protected](6): Range violation
errorScala 74
Pruebas:
fuente
scala> "Hello World".zipWithIndex.par.foreach(x=>{Thread.sleep(x._2*99);print(x._1)}) Hel lWrolod
- Tengo estoprintln(Thread.currentThread.getName)
muestra que los hilos no son únicos.map
lugar deforeach
. Puedes guardar 4 caracteres.Javascript (72)
fuente
Scala (45)
Hilo # unirse a la solución basada
o
fuente
Este es mi intento de F #. Mi primer programa serio de F #. Por favor se amable.
fuente
Ir
fuente
Erlang (90)
Compilar
erlc +export_all h.erl
fuente
Nimrod, 121
fuente
Python: demasiados caracteres, pero funciona.
fuente
C #
9084Versión en ejecución: http://ideone.com/0dXNw
fuente
Objetivo-C (183 caracteres)
fuente
Haskell 99 Personajes
La forma en que funciona es que cada subproceso comienza el siguiente después de haber mostrado su carácter, por lo que las cosas realmente útiles no pueden suceder fuera de secuencia.
fuente
Bash , 43 bytes
Pruébalo en línea!
xargs
se bifurca por separadoprintf
proceso para cada personaje (y espera a que salga).Bash , 45 bytes, sin utilidades externas
Pruébalo en línea!
Se expande a
(printf H); (printf e); (printf l); (printf l); (printf o); (printf \ ); (printf W); (printf o); (printf r); (printf l); (printf d);
antes de la evaluación. Los paréntesis hacen que Bash se bifurque en un subshell para cada letra (y espere a que salga), pero esta vezprintf
es el Bash incorporado.fuente