Saya punya tantangan untuk Anda:
- Cetak "Hello World" menggunakan bahasa apa pun.
- Setiap karakter harus dicetak dari utasnya sendiri yang unik
Itu dia. Jelas, karena tidak ada jaminan bahwa utas akan beroperasi sesuai urutan Anda memulainya, Anda harus membuat utas program Anda aman untuk memastikan hasil cetak dalam urutan yang benar.
Dan, karena ini golf kode, program terpendek menang.
Memperbarui:
Pemenangnya adalah entri APL Marinus , dengan 34 karakter. Itu juga memenangkan hadiah untuk entri yang paling mudah dibaca.
HelolW rdlo
Jawaban:
APL (Dyalog) (
44433934)Penjelasan:
2 11⍴'Hello World',⍳11
membuat matriks: (H, 1), (e, 2), ...&⌿
berarti: untuk setiap kolom matriks, lakukan pada utas terpisah:⍺
sekarang karakter dan⍵
sekarang waktunya⎕DL⊃⍵
menunggu⍵
sebentar.⍞←⍺
menampilkan karakter.sumber
C,
6162 karakterFungsi pthread library semuanya memiliki nama loooooong, jadi alih-alih saya menjalankan seluruh proses terpisah untuk setiap karakter.
fork()
jauh lebih pendek.Itu perlu digunakan
write()
daripadaputchar()
karena fungsi buffer stdio tidak aman-thread.Diedit : Cadangkan hingga 62 karakter. Dalam semangat saya, menjatuhkan ke 61 karakter juga menjatuhkan keamanan benang.
sumber
write(1,"Hello World\n",!!++i)
2 byte. Solusi bagus jika tidak.!!++i
!!i++
, tetapi mengeditnya beberapa detik kemudian, karena saya menyadari itu akan dievaluasi0
pada iterasi pertama. Saya berasumsi Anda telah melihat versi yang belum diedit. Saya tidak dapat menguji kode Anda, karena hanya mencetak karakter pertama, sekali . Ada banyak alternatif;i++<13
, menggunakan!!i
, atau bahkanwrite(1,"Hello World\n",i++>13||fork()||main())
Ruby, 46 karakter
Ini disinkronkan karena fakta bahwa program menunggu utas berakhir sebelum memulai utas berikutnya dan melanjutkan dengan arang berikutnya.
sumber
Pythonect (35 karakter)
http://www.pythonect.org
sumber
Python (
1019398)Ini adalah solusi Peter Taylor. Ini bekerja dengan menunda pencetakan karakter ke-N oleh N detik. Lihat komentar.
Ini yang asli:
Ini berhasil karena waktu yang diperlukan untuk mencetak satu karakter lebih kecil daripada waktu yang diperlukan Python untuk menginisialisasi utas baru, oleh karena itu utas N-th akan selesai sebelum utas N + 1-th dibuat. Rupanya melanggar aturan untuk mengandalkan ini.
sumber
import sys,threading
keimport sys,threading as t
dan Anda dapat menyimpan 2 lagi, dengan meneruskan argumen ke Thread sebagai argumen posisi, bukan argumen kata kunci.threading.Timer
sebagai gantithreading.Thread
. Lulusx
sebagai parameter tidur.for x in range(11):t.Timer(x,sys.stdout.write,"Hello World"[x]).start()
C # 73
sumber
APL (Dyalog Unicode) , 28 byte SBCS
Program lengkap. Mencetak ke stderr. Terinspirasi oleh solusi marinus .
Cobalah online!
⍳11
11 bilangan bulat pertama'Hello World'{
...}&¨
untuk setiap integer sebagai argumen kanan (⍵
), muncul fungsi berikut dengan karakter yang sesuai sebagai argumen kiri (⍺
):⎕DL⍵
d e l ay detik argumen kanan⍺⊣
Buang itu (penundaan efektif) yang mendukung karakter argumen-kiri⍞←
cetak itu untuk stdout tanpa tertinggal garis putussumber
⍞∘←&¨'dlroW olleH'
? - Saya tidak tahu apakah ini dijamin secara teoritis tetapi sepertinya selalu mencetaknya dalam urutan yang benar⍞∘←
tidak terputus (atau itu? Mungkin Anda bisa bertanya kepada pengembang C?). Alat Dyalog hijau benang - 1 benang nyata berpura-pura menjadi banyak, jadi jika (hijau) beralih benang tidak dapat terjadi, pesanan adalah diprediksi.Jawa (160 karakter)
Ya, saya tahu ini adalah bahasa yang salah untuk kode golf, saya melakukannya untuk bersenang-senang.
sumber
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 karakterclass 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 karakterclass 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 karakterBash (64)
sumber
:()([ "$1" ]&&(printf "${1:0:1}"&: "${1:1}"));: Hello\ World
Haskell (
120118)Saya tidak begitu yakin tentang mengalikan dengan 9999 - Saya memiliki Xeon 2Ghz yang berfungsi dengan baik bahkan jika Anda tidak, tetapi saya juga memiliki Pentium 4 yang membutuhkannya (999 memberikan output kacau dan 99 tidak t melakukan apa pun.)
sumber
(*5^6)
alih-alih(*9999)
dan tidak menggunakan backquotes untukmapM_
.(((mapM_ (\(x,y) ... )) zip) [0..]) ...
yang tidak Anda inginkan.999
, mungkin akan terpotong ke 0 karena keterbatasan sistem operasi, tapi saya bisa saja salah. OS apa yang Anda gunakan?scala (
8179 karakter)sumber
Groovy, 51 karakter
sumber
D (135 karakter)
Saya hanya memulai utas berikutnya ketika saya sudah mencetak karakter saat ini
sunting +2 karakter untuk pemeriksaan batas yang lebih baik
sumber
[email protected](6): Range violation
kesalahan.Scala 74
Tes:
sumber
scala> "Hello World".zipWithIndex.par.foreach(x=>{Thread.sleep(x._2*99);print(x._1)}) Hel lWrolod
- Saya mendapatkan iniprintln(Thread.currentThread.getName)
menunjukkan bahwa utasnya tidak unik.map
sebagai gantiforeach
. Anda dapat menyimpan 4 karakter.Javascript (72)
sumber
scala (45)
Utas # gabung solusi berbasis
atau
sumber
Ini adalah upaya F # saya. Program F # serius pertama saya. Mohon berbaik hati.
sumber
Pergi
sumber
Erlang (90)
Menyusun
erlc +export_all h.erl
sumber
Nimrod, 121
sumber
Python: terlalu banyak karakter, tetapi berhasil.
sumber
C #
9084Versi yang sedang berjalan: http://ideone.com/0dXNw
sumber
Objective-C (183 karakter)
sumber
Haskell 99 Karakter
Cara kerjanya adalah setiap utas dimulai berikutnya setelah menampilkan karakternya, sehingga sebenarnya hal-hal yang bermanfaat tidak dapat terjadi di luar urutan.
sumber
Bash , 43 byte
Cobalah online!
xargs
bercabangprintf
proses terpisah untuk setiap karakter (dan menunggu itu untuk keluar).Bash , 45 byte, tidak ada utilitas eksternal
Cobalah online!
Perluas
(printf H); (printf e); (printf l); (printf l); (printf o); (printf \ ); (printf W); (printf o); (printf r); (printf l); (printf d);
sebelum evaluasi. Tanda kurung membuat Bash garpu subkulit untuk setiap huruf (dan tunggu sampai keluar), tapi kali iniprintf
adalah Bash bawaan.sumber