Ich habe eine Herausforderung für dich:
- Drucken Sie "Hello World" in einer beliebigen Sprache.
- Jedes Zeichen muss aus einem eigenen, eindeutigen Thread gedruckt werden
Das ist es. Da es keine Garantie dafür gibt, dass die Threads in der Reihenfolge ausgeführt werden, in der Sie sie starten, müssen Sie Ihren Programm-Thread sicher machen, um sicherzustellen, dass die Ausgabe in der richtigen Reihenfolge gedruckt wird.
Und weil dies Codegolf ist, gewinnt das kürzeste Programm.
Aktualisieren:
Der Gewinner ist Marinus 'APL-Eintrag mit 34 Zeichen. Es gewinnt auch den Preis für den am wenigsten lesbaren Eintrag.
HelolW rdlo
Antworten:
APL (Dyalog) (
44433934)Erläuterung:
2 11⍴'Hello World',⍳11
Erstellt eine Matrix: (H, 1), (e, 2), ...&⌿
bedeutet: für jede Spalte der Matrix machen Sie auf einem separaten Thread:⍺
ist jetzt der Charakter und⍵
ist jetzt die Zeit⎕DL⊃⍵
wartet⍵
Sekunden.⍞←⍺
gibt das Zeichen.quelle
C,
6162 ZeichenDie Funktionen der pthread-Bibliothek haben alle laaaaange Namen, daher habe ich stattdessen für jedes Zeichen einen eigenen Prozess gestartet.
fork()
ist so viel kürzer.Es musste
write()
statt verwendet werden,putchar()
da die stdio-Pufferfunktionen nicht threadsicher sind.Bearbeitet : Bis zu 62 Zeichen sichern. In meinem Eifer ließ das Abfallen auf 61 Zeichen auch die Fadensicherheit fallen.
quelle
write(1,"Hello World\n",!!++i)
für 2 Bytes auf zu ändern . Ansonsten gute Lösung.!!++i
!!i++
, es aber einige Sekunden später bearbeitet, da mir klar wurde, dass es0
bei der ersten Iteration ausgewertet werden würde . Ich nahm an, dass Sie die unbearbeitete Version gesehen hatten. Ich kann Ihren Code nicht testen, da er nur einmal das erste Zeichen ausgibt . Es gibt jedoch viele Alternativen.i++<13
, using!!i
, or evenwrite(1,"Hello World\n",i++>13||fork()||main())
Ruby, 46 Zeichen
Es wird synchronisiert, da das Programm auf das Ende des Threads wartet, bevor der nächste Thread gestartet und mit dem nächsten Zeichen fortgefahren wird.
quelle
Pythonect (35 Zeichen)
http://www.pythonect.org
quelle
Python (
1019398)Dies ist Peter Taylors Lösung. Das Drucken des N-ten Zeichens wird um N Sekunden verzögert. Zeige Kommentare.
Dies ist das Original:
Es hat funktioniert, weil das Drucken eines einzelnen Zeichens weniger Zeit in Anspruch nimmt als das Initialisieren eines neuen Threads in Python. Daher wurde der N-te Thread beendet, bevor der N + 1-te Thread erstellt wurde. Offensichtlich verstößt es gegen die Regeln, sich darauf zu verlassen.
quelle
import sys,threading
,import sys,threading as t
und Sie können 2 weitere Zeichen sparen, indem Sie die Argumente als Positionsargumente anstelle von Schlüsselwortargumenten an Thread übergeben.threading.Timer
anstelle vonthreading.Thread
. Geben Siex
als Schlafparameter ein.for x in range(11):t.Timer(x,sys.stdout.write,"Hello World"[x]).start()
C # 73
quelle
APL (Dyalog Unicode) , 28 Byte SBCS
Volles Programm. Druckt nach stderr. Inspiriert von Marinus 'Lösung .
Probieren Sie es online!
⍳11
erste 11 ganze Zahlen'Hello World'{
…}&¨
Erzeugen Sie für jede Ganzzahl als rechtes Argument (⍵
) die folgende Funktion mit dem entsprechenden Zeichen als linkes Argument (⍺
):⎕DL⍵
d e l ay richtige Argument Sekunden⍺⊣
Verwerfen Sie diese (die effektive Verzögerung) zugunsten des Zeichens mit dem linken Argument⍞←
drucke das auf stdout ohne abschließenden Zeilenumbruchquelle
⍞∘←&¨'dlroW olleH'
? - Ich weiß nicht, ob es theoretisch garantiert ist, aber es scheint, dass es sie immer in der richtigen Reihenfolge⍞∘←
ist nicht unterbrechbar (oder? Vielleicht können Sie einen C-Entwickler fragen?). Dyalog Arbeitsgeräte grüne Fäden - 1 real Gewinde vorgibt viele zu sein, so dass , wenn ein (grün) Threadwechsel nicht stattfinden kann, ist die Reihenfolge ist vorhersagbar.Java (160 Zeichen)
Ja, ich weiß, das ist die falsche Sprache für Code-Golf. Ich mache es zum Spaß.
quelle
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 Zeichenclass 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 Zeichenclass 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 ZeichenBash (64)
quelle
:()([ "$1" ]&&(printf "${1:0:1}"&: "${1:1}"));: Hello\ World
Haskell (
120118)Ich bin mir nicht ganz sicher, ob ich mit 9999 multiplizieren soll - ich habe einen 2-GHz-Xeon, auf dem es auch dann funktioniert, wenn Sie es nicht tun. überhaupt nichts tun.)
quelle
(*5^6)
anstelle von(*9999)
und ohne Anführungszeichen für verwendenmapM_
.(((mapM_ (\(x,y) ... )) zip) [0..]) ...
was Sie nicht möchten.999
, könnte es auf 0 wegen Beschränkungen des Betriebssystems abgeschnitten zu werden , aber ich könnte falsch sein. Welches Betriebssystem verwenden Sie?Scala (
8179 Zeichen)quelle
Groovy, 51 Zeichen
quelle
D (135 Zeichen)
Ich starte den nächsten Thread erst, wenn ich das aktuelle Zeichen bereits gedruckt habe
bearbeite +2 Zeichen für eine bessere Kontrolle
quelle
[email protected](6): Range violation
Fehler.Scala 74
Tests:
quelle
scala> "Hello World".zipWithIndex.par.foreach(x=>{Thread.sleep(x._2*99);print(x._1)}) Hel lWrolod
- Ich habe dasprintln(Thread.currentThread.getName)
zeigt , dass die Fäden sind nicht eindeutig.map
anstelle vonforeach
. Sie können 4 Zeichen speichern.Javascript (72)
quelle
scala (45)
Thread # Join-basierte Lösung
oder
quelle
Dies ist mein F # -Versuch. Mein erstes ernstes F # Programm. Bitte sei nett.
quelle
Gehen
quelle
Erlang (90)
Kompilieren
erlc +export_all h.erl
quelle
Nimrod, 121
quelle
Python: zu viele Zeichen, aber es funktioniert.
quelle
C #
9084Laufende Version: http://ideone.com/0dXNw
quelle
Ziel-C (183 Zeichen)
quelle
Haskell 99 Zeichen
Wie es funktioniert, beginnt jeder Thread am nächsten, nachdem er seinen Charakter angezeigt hat, so dass tatsächlich nützliche Dinge nicht außerhalb der Reihenfolge passieren können.
quelle
Bash , 43 Bytes
Probieren Sie es online!
xargs
Gibtprintf
für jedes Zeichen einen eigenen Prozess aus (und wartet, bis es beendet wird).Bash , 45 Bytes, keine externen Dienstprogramme
Probieren Sie es online!
Erweitert bis
(printf H); (printf e); (printf l); (printf l); (printf o); (printf \ ); (printf W); (printf o); (printf r); (printf l); (printf d);
vor der Auswertung. Die Klammern machen Bash Fork zu einer Unterschale für jeden Buchstaben (und warten, bis er beendet ist), aber diesmalprintf
ist der Bash eingebaut.quelle