Kita semua tahu bagaimana diskusi tentang sistem operasi mana yang terbaik yang menyebabkan banyak perang api. Tujuan Anda sekarang, untuk memberikan "bukti" yang menentukan bahwa sistem operasi favorit Anda lebih baik ... ah, tidak, jauh lebih baik, untuk memberikan "bukti" yang menentukan bahwa sistem operasi lain buruk.
Tugas: Menulis program, yang melakukan perhitungan, dan bekerja dengan benar pada setidaknya satu OS dan salah pada setidaknya satu OS lainnya.
- program harus melakukan setidaknya beberapa perhitungan, sehingga harus membaca beberapa input sederhana (lebih disukai pada input standar, atau jika dari file jika Anda mau, tetapi menyalahgunakan sedikit endian / big endian tidak hanya murah, tetapi juga jelas) , dan memberikan beberapa output tergantung pada input. Perhitungan harus bermakna dan dibenarkan, misalnya menyelesaikan kehidupan nyata atau masalah matematika.
- Anda harus menentukan kedua sistem operasi, yang menyatakan mana yang akan bekerja dengan benar, dan yang mana tidak akan bekerja. Kedua sistem operasi harus dikenal, dan dari waktu yang hampir bersamaan (jadi tidak ada DOS 1.0 versus OS modern). Disarankan untuk memberikan deskripsi singkat tentang penyebab perbedaan (terutama jika Anda mencurigai banyak orang tidak akan menyadarinya) dalam tag spoiler.
seperti ini
penyebab perbedaannya harus halus, jadi tidak ada
#ifdef _WIN32
atau serupa, tolong! Ingat, tujuan Anda adalah untuk "membuktikan" bahwa sistem khusus ini buruk, sehingga orang tidak dapat (segera) mengenali trik Anda!jika ada bagian yang sangat aneh atau sangat tidak biasa dalam kode Anda, Anda harus membenarkannya dalam komentar mengapa ada di sana. Tentu saja, "pembenaran" ini bisa / akan menjadi kebohongan besar.
Mencetak:
Ini bukan golf! Kode harus ditata dengan baik, dan dijaga tetap sederhana. Ingat, tujuan Anda adalah menyembunyikan bug di dalamnya sehingga orang tidak akan curiga. Semakin sederhana kodenya, semakin tidak curiga.
Pemenang akan ditentukan oleh suara. Suara terbanyak setelah sekitar 10 hari setelah pengiriman pertama yang valid menang. Secara umum, jawaban di mana kode mudah dibaca dan dipahami, namun bug disembunyikan dengan baik, dan bahkan jika ditemukan, dapat dikaitkan dengan kesalahan daripada kebencian, harus dipilih. Demikian pula, itu harus bernilai jauh lebih banyak jika bug hanya menyebabkan hasil yang salah, daripada hanya menyebabkan program crash atau tidak melakukan apa-apa.
Seperti biasa, saya menahan hak untuk memilih jawaban sebagai pemenang jika tidak lebih dari 10% atau 1 poin di bawah yang memiliki suara terbanyak, pada kriteria subyektif apa pun.
make (1)
bekerja dengan baik pada dasarnya setiap kotak unix dan beberapa kotak windows. Bukan karena OS, tetapi karena sistem file. Setiap sistem file yang menjaga tanggal modifikasi file ke presisi rendah mungkin gagal denganmake
benar pada mesin cepat.Jawaban:
Unix shell + utilitas standar
Mari kita menulis skrip shell yang menemukan proses (dimiliki oleh pengguna mana pun) yang telah menggunakan waktu CPU paling banyak, dan membunuh semua proses dengan nama yang sama. Saya kira itu dianggap sebagai membaca data (dari sistem) dan melakukan perhitungan. (Perilaku itu dapat berguna untuk proses yang memotong banyak proses, seperti bom fork dan Google Chromium.)
Berikut ini harus menjadi cara portabel untuk mendapatkan nama proses dengan waktu CPU terhebat (saya mencoba menghindari Linuxisme yang jelas tetapi belum mengujinya di Solaris):
Jadi skrip kami sederhana
Jalankan sebagai root untuk hasil terbaik, sehingga dapat mematikan proses dari pengguna lain.
Linux dan BSD
Ini berfungsi di Linux dan harus bekerja pada BSD, karena
killall arg
membunuh proses yang bernamaarg
.Solaris
Namun, pada Solaris, jika pengguna menjalankan program yang diberi nama
9
dalam infinite loop, skrip akan menurunkan sistem . Hal ini karena:NB
sumber
killall
adalah tidak contoh. Itu hanya dua program berbeda dengan nama yang sama. Setiap versi berfungsi dengan baik.Python
Program ini membuka gambar yang ditentukan pada baris perintah dan menampilkannya.
Bekerja di linux, tidak bekerja di windows.
Ini karena cara windows membuka file. Mode biner harus ditentukan agar ini berfungsi dengan baik pada semua sistem operasi.
sumber
Little Endian (Intel x86) vs Big Endian (IBM Power7)
Setiap format file di mana ada jumlah biner multi-byte dalam urutan non-host berisiko disalahtafsirkan. Berikut adalah fungsi yang mengambil audio mentah, katakanlah diekstrak dari file WAV (yang merupakan format file endian Microsoft kecil), membagi dua amplitudo dan mengeluarkan audio yang dilemahkan.
Dalam mesin endian kecil, ini bekerja dengan baik, tetapi pada mesin endian besar, ini adalah bencana. Misalnya
Bergeser ke kanan di little endian:
Bergeser ke kanan di big endian:
Perhatikan bahwa beberapa nybbles benar! Bahkan, kemungkinan 50:50 bahwa output akan benar, tergantung pada apakah bit sampel suara yang paling signifikan adalah 0 atau 1!
Jadi ketika Anda mendengarkan audio ini, itu seperti setengah amplitudo tetapi dengan beberapa suara keras bernada nyaring ditindih. Cukup mengejutkan jika Anda tidak siap untuk itu!
sumber
GTB
Di komputer berfungsi, tetapi pada kalkulator TI-84 saya tidak. Mengapa?
sumber
C
Solusi untuk masalah 100 ini (tentang urutan Collatz) diterima oleh Hakim Online UVa.
Namun, kode ini hanya berfungsi dengan benar pada platform * nix karena
long
tipe diimplementasikan sebagai integer bertanda 64-bit. Pada Windows , kode ini memanggil perilaku tidak terdefinisi, karenalong
tipe diimplementasikan sebagai integer bertanda 32-bit, sementara salah satu nilai menengah dalamcyc()
fungsi membutuhkan setidaknya 32-bit untuk diwakili.Cara lain untuk membuat ini lebih lanjut tidak kompatibel adalah dengan meletakkan array
l
di dalamnyamain()
dan membuat perubahan yang sesuai untukcyc()
berfungsi. Karena executable diatur untuk meminta tumpukan 2 MB secara default di Windows, program langsung macet.sumber
Python
Saya menemukan ini di StackOverflow ketika mencari batas waktu input.
Ini tidak berfungsi untuk Windows.
sumber
conio.h
akan memiliki efek yang sama, tetapi C bahkan tidak dapat dikompilasi.Linux + bash + GNU coreutils
Ini akan menghapus folder root dan semua yang ada di dalamnya yang tidak ada di Windows, bahkan jika Anda menginstal bash untuk Windows :)
sumber
cmd.exe
dan ketikrm
untuk melihat bahwa itu tidak berhasil.