Ini terbatas pada Java dan C # oleh sintaks yang saya kira.
Dalam teka-teki pemrograman ini, Anda harus membuat Exception
s yang dapat ditangkap tetapi dilempar lagi di ujung blok tangkap.
try
{
while(true)
try
{
// you are only allowed to modify code between this try { } brackets
}
catch(Exception ex2) { }
}
catch(Exception ex1)
{
// your goal is to reach this catch block by modifying the code ...
// in the inner try block above
// You win if you reach this part and execute on of the following code lines
Console.WriteLine("You won!"); // for C#
// Or
System.out.println("You won!"); // for Java
}
Anda dapat dengan bebas memasukkan kode sebelum dan sesudah cuplikan ini.
Kode terpendek untuk mencapai catch
blok luar menang.
code-golf
c#
java
programming-puzzle
pengguna21634
sumber
sumber
Jawaban:
C #, 46 (88 termasuk boilerplate)
The
Abort()
Metode menimbulkan ThreadAbortException , yang merupakan pengecualian khusus yang secara otomatis rethrown pada akhir setiap blok catch (kecualiThread.ResetAbort()
disebut).sumber
C # 24 Karakter
menghentikan blok coba bagian dalam sebelum yang dimaksudkan, memungkinkan saya untuk membuat pengecualian di luar blok try.
sumber
int a=1/0;
?)int a=
sana? Beberapa bahasa memungkinkan Anda menulis ekspresi1/0
Java, 76 atau 31
Hanya menghitung penyisipan yang dilakukan pada kode, mengabaikan baris baru. 76 jika Anda menghitung semua yang saya tambahkan, 31 jika Anda mengecualikan baris pertama dan baris terakhir, yaitu hanya menghitung
int a=1/0;try{}catch(Error e){}
.sumber
catch
blok setelah potongan, dia tidak.Java (OpenJDK 8) ,
6560 byte (dengan sedikit modifikasi pada pembungkus)Cobalah online!
Membutuhkan kedua contoh
catch (Exception …)
dalam pertanyaan untuk diubahcatch (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)
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 adalahThreadDeath
(anError
, 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 melemparThreadDeath
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 daricatch
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!".)
sumber
C #
sumber
Perl 5 , 37 atau 36 byte
Cobalah online!
Ternyata pertanyaan ini diterjemahkan ke dalam Perl cukup baik untuk membuat teka-teki yang menarik di sana juga.
try
Setara Perl disebut (sedikit membingungkan)eval
, dan menentukan pengecualian dengan menetapkan@_
pengecualian jika itu terjadi, dan string nol sebaliknya. Dengan demikian, sebuahcatch
blok diimplementasikan melalui membandingkan@_
ke string nol.Solusi ini bekerja dengan membuat objek (yang kelasnya adalah program secara keseluruhan; Anda dapat menggunakan file Perl sewenang-wenang seperti kelas, semacam kebalikan dari Java (di mana Anda dapat menggunakan kelas sewenang-wenang seperti file)). Itulah
bless[]
bagian (bless
biasanya hanya muncul jauh di dalam konstruktor, sebagai primitif yang membuat benda menjadi objek di tempat pertama, tetapi Anda dapat menggunakannya secara langsung jika Anda benar-benar ingin;[]
adalah pengalokasi memori untuk objek - konstruktor daftar, dalam hal ini case - dan kelas tidak diberikan sehingga dianggap sebagai yang sedang dieksekusi). Sementara itu, kami memberikan "class" kami (yaitu file utama) metode custom-to-string viause overload
, dan membuat metode itu melempar pengecualian (sehingga keluar dari loop dan memecahkan teka-teki); kita benar-benar dapat menempatkanuse overload
di mana saja, dan meskipun secara tradisional akan masuk dengan definisi metode lain dan mendekati bagian atas file, kita dapat memasukkannya ke dalam celah yang telah kita berikan sebagai gantinya dan masih berfungsi. (Jika kita meletakkannya di akhir file, kita bisa menghilangkan titik koma setelahnya, yang mengarah ke solusi 36-byte, tetapi ini bisa dibilang curang karena tergantung pada program yang memiliki tanda titik koma di tempat pertama, yaitu tidak dijamin.) Ini sebenarnya lebih pendek untuk membebani operasi stringify dan membiarkan Perl melakukan autogenerasi sebuah string dibandingkan dengan itu, daripada melakukan overload string secara langsung (karena overloading beberapa operator memaksa Anda untuk membebani operator lain juga).Sekarang, yang harus kita lakukan adalah melempar objek kita menggunakan
die
. Theeval
berakhir, maka ketika kita mencoba untuk membandingkan$@
dengan nol tali (untuk melihat apakah ada pengecualian), perbandingan melempar pengecualian lain dan kami melarikan diri di luareval
.sumber