Sleep Sort adalah algoritma pengurutan bilangan bulat yang saya temukan di Internet. Ini membuka aliran output, dan untuk setiap nomor input secara paralel, tunda untuk nomor detik dan output nomor itu. Karena penundaan, angka tertinggi akan dikeluarkan terakhir. Saya memperkirakan ia memiliki O (n + m), di mana n adalah jumlah elemen dan m adalah angka tertinggi.
Ini kode asli di Bash
#!/bin/bash
function f() {
sleep "$1"
echo "$1"
}
while [ -n "$1" ]
do
f "$1" &
shift
done
wait
Ini kodesemu
sleepsort(xs)
output = []
fork
for parallel x in xs:
sleep for x seconds
append x to output
wait until length(output) == length(xs)
return output
Tugas Anda adalah mengimplementasikan Sleep Sort sebagai fungsi dalam bahasa pemrograman pilihan Anda. Anda dapat mengabaikan faktor konkurensi seperti kondisi balapan dan tidak pernah mengunci sumber daya bersama. Kode terpendek menang. Definisi fungsi diperhitungkan terhadap panjang kode.
Daftar input dibatasi hanya untuk bilangan bulat non-negatif, dan panjang daftar input diharapkan cukup panjang (uji setidaknya 10 angka) sehingga kondisi balapan tidak pernah terjadi. dan dengan asumsi kondisi balapan tidak pernah terjadi.
Jawaban:
Semacam upaya Perl lumpuh ,
5955523832 karakter :map{fork||exit print sleep$_}@a
Barebones: 25 Karakter:
... jika Anda tidak keberatan dengan hasil sortir sebagai output mati:
map{fork||die sleep$_}@a
Dengan semua fasilitasnya:
(untuk kepatuhan tantangan maksimum, 44 karakter)
sub t{map{fork||exit print sleep$_}@_;wait}
Jika Anda membiarkan perl menunggu Anda, 39 karakter:
sub t{map{fork||exit print sleep$_}@_}
Dan lagi, jika Anda tidak keberatan
die()
, 32 karakter ...sub t{map{fork||die sleep$_}@_}
Perhatikan bahwa di Perl 6, atau ketika fitur 'say' dideklarasikan, dimungkinkan untuk mengganti
print
fungsinya dengansay
, menyimpan karakter di setiap instance. Jelas karenadie
keduanya mengakhiri proses bercabang dan menulis output, itu tetap solusi terpendek.sumber
perl-E
untuk mengaktifkan fitur 5.010 sepertisay
(fork&&die sleep$_)for@a
bekerja jugaC , 127 karakter, solusi yang agak jelas:
(Dikompilasi dengan
gcc -std=c99 -fopenmp sort.c
dan mengabaikan semua peringatan.)sumber
for(;c>=0;--c){int x=atoi(v[c]);
. Tidak yakin apakah itu diizinkan.Ruby 1.9, 32 karakter
Sebagai fungsi:
Jika kita bisa menggunakan variabel yang sudah ditentukan sebelumnya, itu berkurang menjadi 25 karakter:
sumber
Thread.new{p sleep i}
untuk mencetak hasilnya.JavaScript , 65 karakter (tergantung pada apakah Anda menggunakan
console.log
atau sesuatu yang lain untuk menghasilkan hasilnya)Ini mengasumsikan bahwa itu
a
adalah array bilangan bulat non-negatif dan yangmap()
ada pada prototipe array (JavaScript 1.6+).sumber
1e3
sebagai gantinya.alert
adalah keluaran pemblokiran JavaScript,prompt
adalah pemblokiran inputconfirm
JavaScript , dan pemblokiran input biner JavaScript. Jika JS ditulis pada baris perintah, itu akan menjadi panggilan yang akan Anda gunakan.APL (
1513)Apa fungsinya:
sumber
⎕DL
fungsi yang tidur.Empat percobaan di Erlang:
Output ke konsol, telah mengambil kebebasan untuk melakukan ini masing-masing
9ms * Number
karena ini cukup banyak untuk membuatnya bekerja (diuji pada papan tertanam Atom = lambat):Membutuhkan 60 karakter
Output ke konsol adalah total un-Erlangish, jadi kami mengirim pesan untuk diproses
P
sebagai gantinya:Membutuhkan 55 karakter
Mengirim setelah beberapa waktu juga dapat dilakukan secara berbeda (ini bahkan bekerja dengan
1ms * Number
):Membutuhkan 41 karakter
Sebenarnya ini agak tidak adil karena fungsi
send_after
bawaan adalah pendatang yang terlambat dan membutuhkan namespaceerlang:
diawali, jika kita menganggap namespace ini diimpor (dilakukan pada level modul):Membutuhkan 34 karakter
sumber
C # - 137 karakter
Berikut adalah jawaban dalam C # (diperbarui dengan derajat paralelisme seperti yang dikomentari)
sumber
WithDegreeOfParallelism
agar ini berfungsi, secara analog dengannum_threads
kode OpenMP C saya.void m(int[] l){foreach(var i in l){var t=new Thread(()=>{Thread.Sleep(int.Parse(s));Console.Write(s);});t.Start();}}}
Python - 81
93148150153Tweaking @ BiggAl's code, karena itulah game yang kami mainkan ....
... atau 97
175dengan thread tertunda mulaiMengambil input melalui baris perintah, ala
Seperti halnya banyak golf python, ada satu titik di mana kodenya cukup ringkas sehingga aliasing variabel untuk mempersingkat nama bahkan tidak menyimpan karakter.
Yang satu ini funky karena alias alias dan threading KEDUA seperti t, jadi sys.argv menjadi t.argv. Lebih pendek daripada dari impor foo *, dan penghematan karakter bersih! Namun saya kira Guido tidak akan senang ...
Catatan untuk belajar sendiri c dan berhenti bermain golf dengan python.SAPI KUDUS INI LEBIH MUDAH DARI SOLUSI C!sumber
daemon
tidak perlu pengaturan kecuali Anda memulai ini sebagai daemon, dan lebih pendek untuk menggunakan argumen posisi, esp. if you aliasNone
toN
j
tampaknya berakhir sebagaiFalse
- efek samping dari mencoba melakukan terlalu banyak dalam satu baris?as t,s
dan kemudian mengubah untuk menggunakans
untuksys
print
fungsi sajasys.stdout.write
?Untuk bersenang-senang, inilah versi ColdFusion (8+) ;-) Ia memiliki 109 karakter tanpa menghitung garis pembungkus dan lekukan yang saya tambahkan untuk keterbacaan di sini.
Ini mengasumsikan bahwa
<cfoutput>
berlaku. Beberapa karakter dapat disimpan dengan menulis semuanya dalam satu baris.sumber
Java (alias tidak pernah menang di codegolf):
234211187 karakterungolfed:
sumber
throws Throwable
dan menyingkirkancatch
klausa.Long.parseLong
denganLong.valueOf
.public
danfinal
dapat dihapus;class M{public static void main
bisainterface M{static void main
(Java 8+);Long.parseLong(a)
dapatnew Long(a)
(menghasilkan 165 byte )Javascript - 52 karakter
sumber
Scala -
4240 karakter (case khusus)Jika Anda memiliki kumpulan utas setidaknya ukuran jumlah elemen daftar:
Scala - 72 karakter (umum)
sumber
{}
ketika tetap pada satu baris.{}
dengan satu pernyataan , tetapi Anda masih membutuhkannya untuk mengelompokkan hal-hal yang dipisahkan oleh;
, satu baris atau tidak. Dan Anda dapat menulis pernyataan multi-baris tanpa{}
dalam beberapa kasus (jika / misalnya misalnya).()
untuk satu-baris saja. itu masalah selera di sana, saya pikir. (Aku hanya tidak benar-benar mengerti mengapa()
didukung sama sekali ketika{}
diunggulkan. Mungkin untuk tidak mengasingkan pengguna java secara instan). Scala memang keren, tetapi mendefinisikan blok kode berdasarkan indentasi jelas lebih unggul. (dan kemudian, perang agama terjadi;))()
untuk pernyataan tunggal. Coba masukkan(1 to 9).map(i => {val j = i+1; i*j})
dalam REPL dan kemudian lihat apa yang terjadi jika Anda menggunakan(1 to 9).map(i => (val j = i+1; i*j))
.Haskell - 143 karakter
Ini mungkin bisa dibuat lebih pendek dengan mengambil input pada stdin jika itu pilihan, tapi sudah terlambat dan bagaimanapun, masih 104 karakter untuk fungsi itu sendiri.
sumber
Befunge-98,
3831 byteSaya tahu ini adalah tantangan lama, tetapi saya baru-baru ini menemukan bahasa sleepsort dan 2D, memiliki ide tentang cara menggabungkannya, dan mencari tempat untuk mempostingnya, jadi inilah kami.
IP utama membaca angka (
&
), lalu klikt
yang mengkloningnya: satu menghasilkan pada baris dan siklus yang sama, membaca nomor baru dan menghasilkan anak baru hingga mencapai EOF yang mengakhiri urutan. Semua proses anak terjebak dalam lingkaran tertutup (yangv
dan^
dari kolom ketiga) sampai IP utama selesai membaca input dan mengeksekusi urutan perintah'<21p
, yang menempatkan karakter<
pada posisi (1,2), Timpa^
dan membebaskan semua proses anak, yang mulai siklus secara bersamaan, mengurangi dengan 1 jumlah mereka di setiap iterasi. Karena kecepatan eksekusi IP yang berbeda disinkronkan di befunge, mereka akan mengakhiri (dan mencetak nilainya) secara berurutan, mengurutkan daftar input.sumber
Sedikit terlambat ke pesta:
Maple -
9183 karakterDalam 91:
Dalam 83:
(Ini membutuhkan Maple versi 15, dan mengharapkan daftar untuk diurutkan dalam L)
sumber
C,
7069 karakterTidak menunggu proses anak kembali, jika tidak berfungsi.
sumber
PHP 57 byte
pcntl_fork () hanya tersedia di linux.
sumber
Bash (38):
Sunting: Floating-point dari stdin, dipisahkan oleh spasi atau baris baru.
sumber
Haskell, 90
Saya harap ini memenuhi semua persyaratan.
sumber
𝔼𝕊𝕄𝕚𝕟, 11 karakter / 22 byte
Try it here (Firefox only).
שĤ⇀ôa
, ini terlihat keren.sumber
Hanya beberapa penyesuaian dari versi @rmckenzie:
Ular Python tertunda mulai di
155152114108107:Python tanpa penundaan
130128969593:Mengelola beberapa optimisasi lebih banyak, menggunakan
Timer
alih-alihThread
, yang memiliki panggilan yang lebih ringkas dan menghilangkan kebutuhan untuk mengimportime
. Metode thread start yang tertunda mendapat manfaat dari pemahaman daftar karena menghilangkan kebutuhan untuk menginisialisasi daftar secara terpisah di awal, meskipun dua karakter lebih panjang ("["+"]"+" "-":"
) daripada untuk loop sehingga tidak berguna tanpa awal yang tertunda, dan Anda harus berhati-hati menggunakan daftar daripada generator, atau Anda tidak benar-benar membuat utas pengatur waktu sampai Anda memotong-motong generator.Apakah ada orang lain yang punya optimisasi?
Trik dengan
as
bantuan, tetapi dalam 2.7.1 Anda hanya dapat mengimpor satu modul ke alias, dan setelah beberapa bermain tentang Anda bahkan tidak bisaimport mod1,mod2 as a,b
, Anda harusimport mod1 as a, mod2 as b
. Itu masih menyimpan beberapa karakter, tetapi tidak cukup menyembuhkan-semua yang saya pikir itu ... Dan sebenarnya lebih baik meninggalkan sys sebagai sys. Mengurangi threading masih membantu ...sumber
Clojure, 54
(defn s[n](doseq[i n](future(Thread/sleep i)(prn i))))
sumber
defn
(tanda kurung + daftar argumen: dari 54 hingga 43 chrs), atau gunakanfn
sebagai gantidefn
=> len- = 2 jadi saya akan mengatakan di clj-nya 43: DKarat - 150 byte
Dan inilah mengapa Anda tidak membuat kode golf di Rust, ini lebih bertele-tele daripada Jawa;). Tergantung pada peti eksternal
crossbeam
, akan lebih buruk tanpa itu.Program tes lengkap:
sumber
Agak membosankan, port C #, hanya untuk memulai dengan bahasa lagi:
F # - 90 karakter
sumber
JavaScript, 74
atau 71/65 karakter dengan tidak standar:
sumber
function(a){a.map(function(v){setTimeout(console.log,v,v)})}
mungkin telah bekerja di setidaknya satu browser untuk 60 byte. Tentu saja hari ini Anda akan menulisa=>a.map(v=>setTimeout(console.log,v,v))
sebagai gantinya.Tcl 8.6, 41 karakter
Anda harus membunuhnya dengan
^C
sumber
VB.NET 100 byte
Karena VB.Net membutuhkan lambdas baris tunggal untuk hanya berisi satu pernyataan, kode ini harus memiliki beberapa baris:
Tidak Disatukan:
Namun saya tidak yakin jika Anda menghitung laporan impor dalam jumlah byte karena jika Anda tidak menghitungnya maka saya bisa menulis ini:
VB.NET 71 byte
Tidak Disatukan:
sumber
Groovy, 47 byte
Mengasumsikan angka diberikan pada baris perintah ...
sumber
Mathematica, 34 atau 36 byte
Cukup tambahkan daftar untuk disortir hingga akhir kode ini dan evaluasi. Jika perlu definisi fungsi yang valid maka dibutuhkan dua byte tambahan:
sumber
C ++ 11, 229 byte
Tidak digabungkan dan digunakan:
sumber