Seperti yang kita semua tahu, sistem operasi modern memiliki penjadwal thread yang dapat memilih pesanan yang berbeda untuk menjadwalkan thread Anda berdasarkan logika internal yang kode Anda tidak rahasia untuk. Biasanya Anda merancang kode multithreaded Anda untuk memastikan bahwa nondeterminisme yang dikenakan pada Anda tidak mempengaruhi output Anda secara bermakna.
Tujuannya di sini adalah sebaliknya. Menghasilkan program yang mencetak bilangan bulat dalam interval [0,99] tetapi dalam urutan yang akan bervariasi dari satu menjalankan ke menjalankan karena penjadwal thread OS.
Anda harus mencapai "cukup nondeterminisme", didefinisikan sebagai:
Dalam 10 set 10 percobaan berurutan, program Anda harus menghasilkan setidaknya 9 permutasi unik dalam setiap percobaan. Anda mungkin memiliki sejumlah percobaan yang gagal di kedua sisi berturut-turut 10 yang berhasil.
Atau, dengan kata lain, Anda perlu 100 kali menjalankan program Anda di mana setiap blok 10 berjalan memiliki paling banyak dua kali jalan yang menghasilkan hal yang sama.
Jadi, sesekali bertukar 98 dan 99 tidak akan memotongnya.
Ini adalah kode-golf , jadi jawaban yang menggunakan byte paling sedikit menang.
Detel
- Tulis output Anda ke stdout, satu entri per baris
- Jika Anda memotong-motong format dengan membuat dua utas karakter interleave menulis ke stdout (bahkan kadang-kadang) menghasilkan hal-hal seperti tiga angka digit atau baris kosong, hasil Anda tidak valid
- Satu-satunya pengecualian untuk aturan di atas adalah Anda dapat memancarkan satu baris kosong setelah mencetak nomor yang diperlukan terakhir (sama-sama)
- Jika Anda pernah kehilangan atau menduplikasi nilai yang diperlukan, hasil Anda tidak valid
- Program Anda tidak perlu bersifat non -deterministik pada prosesor inti tunggal (meskipun pujian jika ya)
- Program Anda dapat menggunakan benang / serat hijau yang sebenarnya tidak dikelola oleh kernel OS jika masih memenuhi persyaratan lain dari tantangan dan sistem threading adalah bagian dari bahasa Anda atau pustaka standar untuk bahasa Anda
- Runtime untuk program Anda harus andal di bawah 5 detik pada prosesor modern
- Anda tidak bisa menentukan perubahan pada lingkungan yang terjadi di luar program Anda seperti menunggu atau perubahan pengaturan; program Anda harus lulus apakah menjalankan 100ish kali kembali ke belakang atau dengan satu jam antara setiap kali menjalankan atau 100ish kali secara paralel (yang mungkin akan membantu sebenarnya ...)
- Anda dapat menggunakan coprocessor seperti GPU atau Xeon Phi dan mekanisme penjadwalan internalnya sendiri untuk tugas. Aturan berlaku untuk ini dengan cara yang sama mereka berlaku untuk utas hijau.
- Jangan ragu untuk memprovokasi penjadwal dengan segala macam tidur, hasil, dan trik lainnya selama Anda mematuhi aturan yang ditentukan dalam posting ini
Operasi yang Dilarang
Satu-satunya sumber nondeterminisme yang diizinkan untuk Anda gunakan adalah ketika penjadwal menjadwalkan utas Anda untuk dijalankan. Daftar berikut ini tidak lengkap, dimaksudkan hanya untuk memberikan contoh hal-hal yang tidak boleh Anda lakukan karena mereka mengakui sumber nondeterminisme lainnya.
- Secara langsung atau tidak langsung mengakses segala jenis kemampuan PRNG atau perangkat keras RNG (kecuali jika itu merupakan bagian yang melekat dari penjadwal).
- Membaca dalam segala jenis input (waktu sistem, sistem file, jaringan, dll.)
- Membaca ID utas atau ID Proses
- Menyesuaikan penjadwal OS; Anda harus menggunakan penjadwal OS standar dari OS mainstream
- Menyesuaikan penjadwal benang / serat hijau Anda juga dilarang. Ini berarti bahwa jika Anda menulis bahasa untuk tantangan ini, Anda harus menggunakan utas OS.
Jawab Validasi
Lebih disukai jawaban akan bekerja di semua OS umum dan prosesor modern, dengan pujian yang diberikan sebanding dengan luasnya dukungan. Namun, ini bukan persyaratan tantangan. Minimal jawaban harus mendukung satu prosesor SMP modern dan OS modern. Saya akan menguji jawaban terkemuka sejauh ketersediaan perangkat keras saya.
- Jika entri Anda tidak akan menghasilkan output yang diperlukan pada i7 5960x yang menjalankan Windows 10 v1607 x64, tentukan lingkungan yang diperlukan
- Jika itu sesuatu yang saya dapat dengan mudah mereproduksi dengan VMWare Workstation, berikan spesifikasi OS dan VM yang tepat
- Jika tidak dapat diproduksi di dalam salah satu dari kondisi tersebut, rekam tangkapan layar secara simultan dari pengujian seperti yang dijelaskan di bagian header dan rekaman video genggam layar Anda dengan interaksi mouse dan keyboard (atau skema kontrol apa pun yang tidak standar perhitungan Anda penggunaan perangkat) terlihat jelas dan memposting kedua video beserta jawaban Anda dan sertakan penjelasan tentang mengapa video itu berfungsi
- Sebagai alternatif, dapatkan pengguna lama yang memiliki reputasi baik (yang bukan Anda) dengan perangkat keras yang sesuai untuk mereproduksi hasil dan menjamin Anda
- Jika entri Anda menggunakan bahasa pemrograman eksotis yang tidak dapat diatur oleh pengembang tipikal untuk dikompilasi / jit / interpretasikan, berikan instruksi pengaturan
- Jika entri Anda tergantung pada versi khusus juru bahasa JVM / Python / lainnya, tentukan yang mana
- Jika diperlukan lebih dari 10 menit berturut-turut berjalan untuk mendapatkan 10 uji coba berurutan yang sukses dalam pengujian saya, Anda gagal (jadi jangan biarkan kondisi sukses menjadi kejadian yang aneh, terutama jika Anda berada di dekat bagian atas terikat runtime)
sumber
Jawaban:
Perl 6 , 27 byte
Penjelasan:
Saya harap ini memenuhi tugas. (Jika tidak, tolong beritahu saya).
Pengujian:
Skrip shell yang saya gunakan untuk menguji nondeterminisme yang cukup:
Bagi saya, ini output:
Instruksi pengaturan:
Saya menjalankan tes dengan Rakudo Perl 6 terbaru di Linux 64bit, meskipun saya kira itu akan bekerja pada platform lain.
The halaman download Rakudo memiliki instruksi setup. Saya mengkompilasi milik saya dari git seperti ini:
Cobalah online:
Atau coba saja secara online, gunakan tautan Try It Online yang disediakan oleh @ b2gills. Saya memeriksa beberapa kali dan mendapat urutan yang berbeda setiap kali, tetapi belum memiliki kesabaran untuk menjalankannya 100 kali melalui antarmuka online itu.
sumber
bash,
3228 byteSaya menjalankan ini 100 kali dan mendapat 100 hasil yang berbeda.
Sunting: Disimpan 4 byte berkat @DigitalTrauma.
sumber
for i in {0..99};{ echo $i&}
, tetapi Anda memposting lebih dulu - Anda dapat menerimanya :)PowerShell ,
54464439 byteAlur Kerja PowerShell tidak didukung di TIO, jadi Anda tidak dapat mencobanya di sana. Seharusnya bekerja dengan baik pada mesin Windows 10 Anda :)
Menentukan fungsi
p
yang akan menampilkan daftar angka saat dipanggil.Pengaturan waktu
Satu menjalankan andal berjalan di sekitar 600 ms pada mesin saya. 100 tes yang ditentukan di bawah selesai dalam waktu kurang dari 2 menit.
Pengujian
Berikut kode lengkap untuk mengujinya:
Output pada mesin saya:
sumber
GCC di Linux, 47 byte
Ini memberi saya hasil yang berbeda hampir setiap kali, telah dikompilasi dengan
gcc
(tanpa bendera) versi 4.9.2. Secara khusus, saya menggunakan Debian 8.6 64-bit (kernel versi 3.16.31).Penjelasan
Jika
fork()
mengembalikan nol (proses anak), nilaii
dicetak, dan kondisi loop salah, karenaprintf
akan mengembalikan nilai lebih besar dari nol. Dalam proses induk, kondisi loop tepati--
.sumber