Peringatan : Program-program ini adalah bom klon (semacam bom fork yang tidak berbahaya tapi masih berbahaya); dengan demikian, jangan menjalankannya pada sistem produksi tanpa sandboxing atau batasan sumber daya . Bom klon membuat utas dalam satu lingkaran (tidak seperti bom fork, yang menciptakan proses dalam satu lingkaran), sehingga Anda dapat menghentikannya hanya dengan membunuh proses yang dimaksud (membuatnya jauh lebih berbahaya daripada bom fork, yang bisa sangat sulit untuk membersihkan); tetapi mereka kemungkinan akan mengikat sebagian besar CPU Anda sampai Anda berhasil melakukannya (atau sampai program menang dan keluar secara alami dengan sendirinya). Meminta OS Anda untuk membatasi jumlah memori dan waktu CPU yang diizinkan untuk digunakan oleh program ini harus menciptakan lingkungan yang aman untuk mengujinya.
Java (OpenJDK 8) , 65 60 byte (dengan sedikit modifikasi pada pembungkus)
Thread x=Thread.currentThread();new Thread(x::stop).start();
Cobalah online!
Membutuhkan kedua contoh catch (Exception …)
dalam pertanyaan untuk diubah catch (Throwable …)
. Secara teori ini seharusnya lebih aman, tidak kurang, tetapi memungkinkan solusi ini dimungkinkan.
Saya menyimpan 5 byte dari versi pertama jawaban ini menggunakan referensi metode daripada lambda.
Java 4, 104 byte (belum diuji, harus bekerja dengan pembungkus asli)
final Thread x=Thread.currentThread();new Thread(){public void run(){x.stop(new Exception());}}.start();
Cobalah online! (tautan menuju implementasi Java 8, sehingga tidak akan berfungsi)
Menggunakan fitur yang telah dihapus dari versi Java modern, dimungkinkan untuk menyelesaikan bahkan versi puzzle yang membutuhkan Exception
. Mungkin setidaknya. (Java 4 sudah sangat tua sekarang dan saya tidak ingat fitur mana yang ia lakukan dan tidak mengandung. Seperti dapat dilihat, ada banyak fitur yang lebih sedikit di Jawa saat itu dan karena itu lebih verbose; kami tidak memiliki lambdas, jadi saya harus membuat kelas batin.)
Penjelasan
Sebagian besar solusi untuk pertanyaan ini adalah dalam C # (bersama-sama dengan solusi Java yang menipu melalui menggunakan tanda kurung tidak seimbang sebagai bentuk injeksi kode, dan solusi Perl yang juga tidak di Jawa). Jadi saya pikir ada baiknya mencoba menunjukkan bagaimana teka-teki ini dapat diselesaikan dengan "benar" di Jawa juga.
Kedua program secara efektif identik (dengan demikian fakta bahwa program pertama berfungsi memberi saya kepercayaan tinggi bahwa program kedua juga akan berfungsi, kecuali saya secara tidak sengaja menggunakan fitur non-Java-4; Thread#stop
sudah tidak digunakan lagi di Java 5).
Thread#stop
Metode Java bekerja, di belakang layar, melalui menyebabkan lemparan untuk dilemparkan ke utas yang dimaksud. The throwable yang dimaksudkan untuk tujuan tersebut adalah ThreadDeath
(an Error
, khususnya karena orang sering mencoba untuk menyelimuti pengecualian dan desainer Java tidak ingin hal itu terjadi), meskipun hal itu memungkinkan Anda untuk melempar apa saja (atau dulu; di beberapa titik setelah API adalah dirancang, desainer Java menyadari bahwa ini adalah ide yang sangat buruk dan menghapus versi metode yang mengambil argumen langsung). Tentu saja, bahkan versi yang melempar ThreadDeath
adalah operasi yang cukup berisiko di mana Anda dapat membuat beberapa jaminan (misalnya, memungkinkan Anda untuk memecahkan teka-teki ini, sesuatu yang "seharusnya" tidak mungkin), sehingga Anda tidak seharusnya gunakan itu, tetapi pada Java 8, masih berfungsi.
Program ini bekerja dengan menelurkan utas baru, dan memintanya untuk secara paksa melemparkan pengecualian kembali ke utas utama. Jika kita beruntung, itu akan melakukan itu pada suatu saat ketika kita berada di luar catch
blok dalam (kita tidak dapat melarikan diri dari catch
blok luar sampai program berakhir, karena ada lingkaran di sekitarnya). Karena kami telah menambahkan loop dengan mudah, menghemat byte untuk menggunakan loop itu agar kami dapat terus membuat utas, dengan harapan salah satu dari mereka pada akhirnya akan mencapai waktu yang tepat. Ini biasanya terjadi dalam beberapa detik.
(Catatan TIO: versi TIO saat ini cukup cenderung untuk mematikan program ini di awal pelaksanaannya, mungkin karena semua utas sedang dibuat. Ini dapat bekerja pada TIO, tetapi tidak bekerja dengan andal, sehingga seringkali beberapa upaya diperlukan untuk dapatkan hasil "Anda menang!".)