J'ai un challenge pour toi:
- Imprimez "Hello World" en utilisant n'importe quelle langue.
- Chaque caractère doit être imprimé à partir de son propre fil unique
C'est ça. Bien entendu, comme il n’est pas garanti que les threads fonctionneront dans l’ordre dans lequel vous les avez démarrés, vous devez sécuriser votre thread de programme pour que le résultat soit imprimé dans le bon ordre.
Et, parce que c'est du golf de code, le programme le plus court gagne.
Mise à jour:
Le gagnant est l’entrée APL de Marinus , avec 34 caractères. Il remporte également le prix de l'entrée la moins lisible.
HelolW rdlo
Réponses:
APL (Dyalog) (
44433934)Explication:
2 11⍴'Hello World',⍳11
crée une matrice: (H, 1), (e, 2), ...&⌿
signifie: pour chaque colonne de la matrice, faites sur un thread séparé:⍺
c'est maintenant le personnage et⍵
c'est maintenant le moment⎕DL⊃⍵
attend des⍵
secondes.⍞←⍺
sort le caractère.la source
C,
6162 caractèresLes fonctions de la bibliothèque pthread ont toutes un nom loooooong. J'ai donc lancé un processus distinct pour chaque caractère.
fork()
est tellement plus courte.Il était nécessaire d'utiliser à la
write()
place deputchar()
parce que les fonctions de tampon stdio ne sont pas thread-safe.Édité : Sauvegarde jusqu'à 62 caractères. Dans mon zèle, le fait de descendre à 61 caractères a également fait tomber le filet de sécurité.
la source
write(1,"Hello World\n",!!++i)
2 octets. Belle solution sinon.!!++i
!!i++
, mais je l'ai édité quelques secondes plus tard, car je me suis rendu compte que l'évaluation se ferait à0
la première itération. J'ai supposé que vous aviez vu la version non éditée. Je ne suis pas en mesure de tester votre code, car il n'imprime le premier caractère, une fois . Il y a beaucoup d'alternatives cependant;i++<13
, en utilisant!!i
, ou mêmewrite(1,"Hello World\n",i++>13||fork()||main())
Ruby, 46 personnages
Il est synchronisé car le programme attend la fin du thread avant de démarrer le prochain thread et de continuer avec le caractère suivant.
la source
Pythonect (35 caractères)
http://www.pythonect.org
la source
Python (
1019398)C'est la solution de Peter Taylor. Cela fonctionne en retardant l'impression du Nième caractère de N secondes. Voir les commentaires.
C'est l'original:
Cela a fonctionné, car le temps nécessaire pour imprimer un seul caractère est inférieur au temps nécessaire à l'initialisation d'un nouveau thread par Python. Le N-ème thread s'achèverait donc avant la création du N-1-ème thread. Apparemment, il est contraire aux règles de s'en prévaloir.
la source
import sys,threading
enimport sys,threading as t
et vous pouvez en enregistrer 2 autres, en transmettant les arguments à Thread sous forme d'arguments de position, plutôt que d'arguments de mot clé.threading.Timer
au lieu dethreading.Thread
. Passer enx
tant que paramètre de sommeil.for x in range(11):t.Timer(x,sys.stdout.write,"Hello World"[x]).start()
C # 73
la source
APL (Dyalog Unicode) , SBCS sur 28 octets
Programme complet. Imprime sur stderr. Inspiré par la solution de marinus .
Essayez-le en ligne!
⍳11
11 premiers entiers'Hello World'{
…}&¨
Pour chaque entier sous forme d'argument de droite (⍵
), créez la fonction suivante avec le caractère correspondant sous forme d'argument de gauche (⍺
):⎕DL⍵
d e l ay des secondes d'argument juste⍺⊣
rejeter que (le délai effectif) en faveur du caractère d'argument de gauche⍞←
imprimer cela sur stdout sans fin de lignela source
⍞∘←&¨'dlroW olleH'
vous - Je ne sais pas si c'est garanti en théorie mais cela semble toujours les imprimer dans le bon ordre⍞∘←
n’est pas interruptible (ou peut-être pouvez-vous demander à un développeur C?). Dyalog implémente des threads verts - 1 vrai thread prétendant être multiple. Par conséquent, si un commutateur de threads (vert) ne peut pas se produire, l'ordre est prévisible.Java (160 caractères)
Oui, je sais que c'est la mauvaise langue pour le code golf, je le fais pour le plaisir.
la source
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 caractèresclass 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 caractèresclass 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 caractèresBash (64)
la source
:()([ "$1" ]&&(printf "${1:0:1}"&: "${1:1}"));: Hello\ World
Haskell (
120118)Je ne suis pas sûr de pouvoir multiplier par 9999 - j'ai un Xeon 2Ghz qui fonctionnera bien même si vous ne le faites pas, mais j'ai aussi un Pentium 4 qui en a besoin (999 donne une sortie tronquée et 99 ne le sont pas. ne rien faire du tout.)
la source
(*5^6)
plutôt que de(*9999)
ne pas utiliser les citations arrières pourmapM_
.(((mapM_ (\(x,y) ... )) zip) [0..]) ...
fera comme vous ne le souhaitez pas.999
, il pourrait être tronqué à 0 en raison de limitations du système d'exploitation, mais je peux me tromper. Quel système d'exploitation utilisez-vous?scala (
8179 caractères)la source
Groovy, 51 caractères
la source
D (135 caractères)
Je ne commence le prochain thread que lorsque j'ai déjà imprimé le caractère actuel
éditer +2 caractères pour un meilleur contrôle lié
la source
[email protected](6): Range violation
erreur.Scala 74
Tests:
la source
scala> "Hello World".zipWithIndex.par.foreach(x=>{Thread.sleep(x._2*99);print(x._1)}) Hel lWrolod
- J'ai eu ceciprintln(Thread.currentThread.getName)
que les threads ne sont pas uniques.map
au lieu deforeach
. vous pouvez enregistrer 4 caractères.Javascript (72)
la source
Scala (45)
Thread # rejoindre la solution basée
ou
la source
Ceci est ma tentative de F #. Mon premier programme F # sérieux. S'il vous plaît soyez gentil.
la source
Aller
la source
Erlang (90)
Compiler
erlc +export_all h.erl
la source
Nimrod, 121
la source
Python: trop de caractères, mais ça marche.
la source
C #
9084Version en cours d'exécution: http://ideone.com/0dXNw
la source
Objective-C (183 caractères)
la source
Haskell 99 personnages
Comment cela fonctionne-t-il? Chaque thread commence le suivant après avoir affiché son caractère, de sorte qu'il ne peut pas arriver que des choses utiles se déroulent dans le désordre.
la source
Bash , 43 octets
Essayez-le en ligne!
xargs
forks unprintf
processus séparé pour chaque caractère (et attend sa sortie).Bash , 45 octets, aucun utilitaire externe
Essayez-le en ligne!
S'étend à
(printf H); (printf e); (printf l); (printf l); (printf o); (printf \ ); (printf W); (printf o); (printf r); (printf l); (printf d);
avant l'évaluation. Les parenthèses font de Bash un sous-shell pour chaque lettre (et attendent qu’elle seprintf
termine ), mais cette fois, c’est la fonction intégrée de Bash.la source