Sebagai bagian dari jawabannya untuk Membuat Kesalahan Quine! , @Falko mengusulkan algoritma berikut:
Bagaimana cara membuat solusi Anda sendiri dalam 2 menit?
- Buka file baru dalam IDE pilihan Anda.
- Taburkan kepala Anda ke keyboard di depan Anda.
- Menyusun.
- Ganti kode dengan pesan kesalahan kompiler.
- Ulangi langkah 3 dan 4 hingga kode terkonvergensi.
Saya yakin prosedur seperti ini akan berakhir dengan cepat dalam banyak kasus!
Tugas
Tugas Anda adalah membuktikan bahwa dia salah.
Tulis program lengkap yang memenuhi hal berikut:
Ketika dikompilasi atau ditafsirkan, itu menghasilkan pesan kesalahan yang, ketika dikompilasi atau ditafsirkan pada gilirannya, juga menghasilkan pesan kesalahan.
Mengulangi langkah 1 berulang-ulang pada akhirnya akan menemukan titik yang tetap, yaitu quine kesalahan.
Aturan tambahan
Pesan kesalahan terakhir harus memiliki panjang positif. Namun, pesan kesalahan sebelumnya dan kode sumber aslinya mungkin kosong.
Panjang kode sumber asli tidak boleh lebih dari 1024 byte.
Baik kode asli atau kode yang dihasilkan dalam langkah apa pun tidak dapat menghasilkan keluaran non-kesalahan.
Keluaran harus secara jelas dapat diidentifikasi sebagai pesan kesalahan, yang harus dihasilkan oleh kompiler / juru bahasa karena kesalahan sintaks, kesalahan runtime, referensi yang tidak ditentukan, dll.
Program Anda mungkin tidak menerima input apa pun atau mengharuskan bendera apa pun untuk menghasilkan loop.
Program Anda dapat mengandalkan implementasi spesifik dari bahasa atau versinya.
Mencetak gol
Skor Anda adalah jumlah langkah terbatas yang dibutuhkan oleh kode sumber Anda sebelum menghasilkan quine kesalahan. Pengajuan dengan skor tertinggi akan menang.
Panjang kode sumber asli akan digunakan sebagai tie breaker. Lebih pendek lebih baik.
Contoh
Dalam Chicken , programnya
menghasilkan pesan kesalahan berikut:
TypeError: Cannot read property 'NaN' of undefined
Jika pesan kesalahan ini, pada gilirannya, ditafsirkan, itu menghasilkan pesan kesalahan
Error on line 1: expected 'chicken'
yang, jika ditafsirkan pada gilirannya, menghasilkan dirinya sendiri.
Dengan demikian, skor program Ayam kosong adalah 2.
Contoh tandingan
Kode PHP
ab<?=c
menghasilkan pesan kesalahan
PHP Parse error: syntax error, unexpected '?' in Command line code on line 1
yang menghasilkan sendiri ketika diartikan.
Namun, kode sumber kedua mencetak pesan ke STDOUT, membuat urutan ini tidak valid.
Segmentation fault (core dumped)
.Jawaban:
Bash, 9223372036854775810
Terinspirasi oleh jawaban Doorknob.
Itu harus dijalankan dengan
bash < file.sh
, atau menggunakan nama file yang sama untuk setiap program, untuk menghilangkan nama file yang berbeda dalam pesan kesalahan.Beberapa kesalahan pertama adalah (dengan
LANG=C
):Dan akhirnya:
yang merupakan quine kesalahan.
sumber
bc
atau menulis kode saya sendiri untuk pengurangan.Pip 0.15.05.29 , lebih dari 10 100.000
Secara teknis tidak valid karena memerlukan
-w
bendera untuk keluaran peringatan. Yang sedang berkata, Pip by design tidak menampilkan kesalahan runtime kecuali mereka benar-benar crash program (rekursi tak terbatas, misalnya); masalah dengan kode ini adalah hal-hal yang pasti akan dikeluhkan oleh bahasa lain.Jumlah langkah yang tepat hanya bergantung pada nilai yang diberikan
i
, sehingga bisa jadi besar secara sewenang-wenang (sampai juru bahasa Python kehabisan memori). Juga, akan dibutuhkan waktu lebih lama dari umur alam semesta untuk menyelesaikan urutan di atas. (Pertanyaannya memang menentukan "lambat"!)Penjelasan:
Butuh beberapa menyisir melalui penerjemah sebelum saya menemukan kesalahan yang akan membiarkan saya memasukkan kode arbitrer ke dalam pesan peringatan. Setelah itu, pada dasarnya memodifikasi teknik quine standar. Contoh di sini menggunakan nilai
i
-5
untuk tujuan penjelasan.Setelah pengaturan
i
, simpan string dalamd
dan kemudian coba jalankanS
pernyataan wap. Swap mengharapkan dua variabel (lebih akurat, nilai).s
baik-baik saja, tetapi ungkapan kedua adalahi?dRo--iRsRPda
. Jikai
benar (bukan nol, untuk tujuan kami), terner mengevaluasidRo--iRsRPd
, yang menggunakand
dari sebelumnya untuk membentuk quine dekat - hanya dengani
decremented. Ungkapan ini bukan nilai, jadi Pip mengeluh:... yang kemudian memulai semuanya dari awal lagi. (
Attempting to swap non-lvalue
adalah sekelompok no-ops:At
menghitung nilai ASCIIt = 10
,n-l
kurangi baris baru dikurangi setiap nilai daftar kosong, dan semua huruf kecil hanyalah variabel.)Proses berlanjut seperti mode sampai ke:
Ketika ini dijalankan,
i
sekarang salah. Ekspresi terner mengevaluasi ke cabang laina
- yang merupakan lvalue. Dengan demikian, swap tidak lagi mengeluh. Sebaliknya, kami mendapatkan:Dan setelah menjalankan ini, akhirnya, kami memiliki kesalahan sintaksis yang sebenarnya:
... pada titik mana, sejak "program" dimulai
R
, Pip akan terus mengeluh bahwaR
itu bukan operator yang tidak tetap selamanya.Solusi terbaik yang tidak digunakan
-w
adalah panjang 3:sumber
-w
dianggap sebagai bahasa pemrograman berdasarkan konsensus metaJulia, 3
Yang sederhana hanya untuk membuat bola bergulir ...
Program awal:
Kesalahan 1:
Ini mungkin tidak didefinisikan, tetapi jika itu bahasa Spanyol , itu juga tidak terduga. Tidak ada yang mengharapkan Inkuisisi Spanyol.
Kesalahan 2:
Kesalahan 3:
Pesan kesalahan ketiga, ketika dikirim sebagai program, menghasilkan kesalahan yang sama, maka skor 3.
Bekerja dalam proses! Tentunya saya bisa melakukan lebih baik dari 3.
sumber
R, 5
Program awal:
Kesalahan 1:
Kesalahan 2:
Kesalahan 3:
Kesalahan 4:
Kesalahan 5 (Quine):
sumber
Bash, 3
Skrip shell yang sangat sederhana untuk mengujinya:
sumber
stdout
. Jika adastdout
danstderr
, itu tidak akan berfungsi dengan baik.Ruby, 5
Program awal
1
2
3
4
5 (Quine)
sumber
Jawa, 5
Ini sangat panjang ... jadi saya memverifikasi kesetaraan string menggunakan skrip Python, dan saya membuat posting yang diformat ini, jadi saya tidak perlu memasukkan tab secara manual pada 400 baris.
Program awal
1
2
3
4
5 (Quine) - Dihilangkan karena panjang posting.
sumber
javac -version
)?Javascript, 3 tingkat kesalahan
Ini bukan 'golok' atau apa pun, tapi saya merasa agak aneh ...
Kesalahan 0 (asli):
Kesalahan 1:
Kesalahan 2:
Kesalahan 3 (quine):
Ini semua dikembalikan pada Internet Explorer 11.0.9600.17416, karena kesalahan diterjemahkan ke Bahasa Inggris.
Printscreen:
* Pesan kesalahan ditampilkan dalam Bahasa Portugis dan dapat dengan mudah diterjemahkan ke Bahasa Inggris
sumber
JS di Firefox 66.0; 3 tingkat kesalahan
Memasukkan:
6?4;
Kesalahan # 1 = Input # 2:
missing : in conditional expression
Kesalahan # 2 = Input # 3:
expected expression, got keyword 'in'
Kesalahan # 3 = Input # 4 = Kesalahan # 4:
unexpected token: identifier
Ini yang tertinggi yang saya dapat.
sumber