Mam dla ciebie wyzwanie:
- Wydrukuj „Hello World” w dowolnym języku.
- Każda postać musi być wydrukowana z własnego, unikalnego wątku
Otóż to. Oczywiście, ponieważ nie ma gwarancji, że wątki będą działały w kolejności, w jakiej je uruchomiłeś, musisz zapewnić bezpieczeństwo swojego wątku programu, aby mieć pewność, że wydruk zostanie wydrukowany we właściwej kolejności.
A ponieważ jest to kod golfowy, wygrywa najkrótszy program.
Aktualizacja:
Zwycięzcą jest wpis APL Marinusa, składający się z 34 znaków. Wygrywa także nagrodę za najmniej czytelne zgłoszenie.
HelolW rdlo
Odpowiedzi:
APL (Dyalog) (
44433934)Wyjaśnienie:
2 11⍴'Hello World',⍳11
tworzy macierz: (H, 1), (e, 2), ...&⌿
oznacza: dla każdej kolumny macierzy wykonaj w osobnym wątku:⍺
jest teraz postacią i⍵
nadszedł czas⎕DL⊃⍵
czeka⍵
sekund.⍞←⍺
wypisuje postać.źródło
C,
6162 znakówWszystkie funkcje biblioteki pthread mają długie nazwy, więc zamiast tego uruchomiłem osobny proces dla każdej postaci.
fork()
jest o wiele krótszy.Konieczne było użycie
write()
zamiast,putchar()
ponieważ funkcje buforowania stdio nie są bezpieczne dla wątków.Edytowano : Wykonaj kopię zapasową do 62 znaków. W mojej gorliwości zejście do 61 znaków obniżyło także bezpieczeństwo wątków.
źródło
write(1,"Hello World\n",!!++i)
na 2 bajty. W przeciwnym razie fajne rozwiązanie.!!++i
!!i++
, ale zredagowałem go kilka sekund później, ponieważ zdałem sobie sprawę, że0
przy pierwszej iteracji będzie to oceniać . Zakładałem, że widziałeś niezredagowaną wersję. Nie jestem w stanie przetestować twojego kodu, ponieważ wypisuje on tylko pierwszy znak, raz . Istnieje jednak wiele alternatyw;i++<13
, używając!!i
, a nawetwrite(1,"Hello World\n",i++>13||fork()||main())
Ruby, 46 znaków
Jest zsynchronizowany ze względu na fakt, że program czeka na zakończenie wątku przed rozpoczęciem następnego wątku i kontynuowaniem następnego znaku.
źródło
Pythonect (35 znaków)
http://www.pythonect.org
źródło
Python (
1019398)To jest rozwiązanie Petera Taylora. Działa poprzez opóźnienie drukowania N-tego znaku o N sekund. Zobacz komentarze.
To jest oryginalny:
Działało, ponieważ czas potrzebny do wydrukowania pojedynczego znaku jest krótszy niż czas potrzebny Pythonowi na zainicjowanie nowego wątku, dlatego N-ty wątek skończyłby się przed utworzeniem N + 1-tego wątku. Najwyraźniej poleganie na tym jest niezgodne z zasadami.
źródło
import sys,threading
naimport sys,threading as t
i możesz zaoszczędzić 2, przekazując argumenty do wątku jako argumenty pozycyjne zamiast argumentów słów kluczowych.threading.Timer
zamiastthreading.Thread
. Podajx
jako parametr uśpienia.for x in range(11):t.Timer(x,sys.stdout.write,"Hello World"[x]).start()
C # 73
źródło
APL (Dyalog Unicode) , 28 bajtów SBCS
Pełny program Drukuje na stderr. Zainspirowany rozwiązaniem marinus .
Wypróbuj online!
⍳11
pierwsze 11 liczb całkowitych'Hello World'{
…}&¨
Dla każdej liczby całkowitej jako prawego argumentu (⍵
), spawn następującą funkcję z odpowiednim znakiem jako lewym argumentem (⍺
):⎕DL⍵
d e l Ay sek prawego argumentu⍺⊣
odrzuć to (skuteczne opóźnienie) na korzyść znaku lewostronnego⍞←
wydrukuj to na standardowe wyjście bez przerywania liniiźródło
⍞∘←&¨'dlroW olleH'
? - Nie wiem, czy jest to teoretycznie gwarantowane, ale wydaje się, że zawsze drukuje je we właściwej kolejności⍞∘←
nie jest przerywany (a może jest to możliwe? Może poprosić programistę języka C?). Dyalog implementuje zielone wątki - 1 prawdziwy wątek udaje, że jest ich wiele, więc jeśli nie może wystąpić (zielony) przełącznik wątku, kolejność jest przewidywalna.Java (160 znaków)
Tak, wiem, że to zły język dla golfa kodowego, robię to dla zabawy.
źródło
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 znakówclass 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 znakówclass 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 znakówBash (64)
źródło
:()([ "$1" ]&&(printf "${1:0:1}"&: "${1:1}"));: Hello\ World
Haskell (
120118)Nie jestem pewien, czy pomnożyć przez 9999 - mam Xeon 2Ghz, na którym będzie działał dobrze, nawet jeśli nie, ale mam też Pentium 4, który tego potrzebuje (999 dał zniekształcony wynik, a 99 nie zrobił ” w ogóle nic.)
źródło
(*5^6)
zamiast(*9999)
i nie używając cudzysłowów dlamapM_
.(((mapM_ (\(x,y) ... )) zip) [0..]) ...
którego nie chcesz.999
, może być obcinany do 0 z powodu ograniczeń systemu operacyjnego, ale mogę się mylić. Z jakiego systemu operacyjnego korzystasz?scala (
8179 znaków)źródło
Groovy, 51 znaków
źródło
D (135 znaków)
Następny wątek zaczynam dopiero, gdy już wydrukowałem bieżący znak
edytuj +2 znaki, aby lepiej sprawdzić wiązanie
źródło
[email protected](6): Range violation
błąd.Scala 74
Testy:
źródło
scala> "Hello World".zipWithIndex.par.foreach(x=>{Thread.sleep(x._2*99);print(x._1)}) Hel lWrolod
- Rozumiemprintln(Thread.currentThread.getName)
Pokazuje również , że wątki nie są unikalne.map
zamiastforeach
. możesz zapisać 4 znaki.JavaScript (72)
źródło
scala (45)
Rozwiązanie oparte na łączeniu wątków
lub
źródło
To jest moja próba F #. Mój pierwszy poważny program w języku F #. Proszę bądź uprzejmy.
źródło
Udać się
źródło
Erlang (90)
Skompilować
erlc +export_all h.erl
źródło
Nimrod, 121
źródło
Python: za dużo znaków, ale działa.
źródło
C #
9084Działająca wersja: http://ideone.com/0dXNw
źródło
Cel C (183 znaków)
źródło
Haskell 99 znaków
Jak to działa, każdy wątek zaczyna się od następnego po wyświetleniu swojego charakteru, więc tak naprawdę przydatne rzeczy nie mogą wydarzyć się poza sekwencją.
źródło
Bash , 43 bajty
Wypróbuj online!
xargs
rozwidla osobnyprintf
proces dla każdej postaci (i czeka na zakończenie).Bash , 45 bajtów, brak zewnętrznych narzędzi
Wypróbuj online!
Rozwija się
(printf H); (printf e); (printf l); (printf l); (printf o); (printf \ ); (printf W); (printf o); (printf r); (printf l); (printf d);
przed oceną. Nawiasy sprawiają, że rozwidlenie Bash jest podpowłoką dla każdej litery (i czeka na zakończenie), ale tym razemprintf
jest to wbudowane Bash.źródło