Program Quine atau Quine adalah program yang mengeluarkan kode sumbernya sendiri ketika dijalankan. Seorang Quine tidak boleh "melangkah keluar dari dirinya sendiri" dengan, misalnya, mencetak konten file yang berisi file tersebut atau menggunakan kemampuan introspektif untuk mencetak representasinya sendiri. Sebaliknya, ia harus menghitung kode sumbernya sendiri.
Cara klasik untuk membuat program semacam itu dilakukan dalam dua langkah:
- Inisialisasi variabel string dengan placeholder untuk interpolasi.
- Cetak string dan interpolasi ke dalam string itu sendiri .
Triknya adalah dengan mendapatkan string yang tepat. Cara melakukan ini berbeda-beda dari satu bahasa ke bahasa lain dan bergantung pada cara variabel dideklarasikan, kebutuhan titik koma dan baris baru, tanda kutip yang diperlukan, dll. Penggunaan tanda kutip memang menarik; Kita harus menemukan cara untuk menunjukkan bahwa tanda kutip harus dicetak tanpa benar-benar menggunakan tanda kutip.
Pesta
Seperti kebanyakan hal di Bash, program ini menggunakan kekhasan yang menarik. Meskipun kutipan tunggal adalah kutipan yang kuat dan tidak memperluas apa pun, namun ditafsirkan printf karakter escape oktal sebagai karakter dengan titik kode yang ditentukan:
s='s=\47%s\47;printf "$s" "$s"';printf "$s" "$s"
Ular piton
Di Python, penentu format kembali %r secara otomatis tanda kutip tunggal. Paling mudah jika kode diakhiri dengan karakter baris baru:
s='s=%r;print(s%%s)';print(s%s)
Jika Anda ingin kode tanpa jeda baris, Anda harus menulis yang berikut ini:
s='s=%r;print(s%%s,sep="")';print(s%s,sep="")
JavaScript
Quine JavaScript berikut dijalankan di bawah node.js. kamu gunakan console.log, yang selalu menambahkan baris baru, sehingga diperlukan baris baru di akhir setiap skrip:
s="s=%j;console.log(s,s)";console.log(s,s)
Program berikut ini juga menarik: program ini tidak mencetak seluruh representasinya, tetapi bergantung pada fakta bahwa fungsi memiliki representasi tertentu:
(function a(){console.log('('+a+')()')})()
Contoh selanjutnya hampir mendekati kecurangan karena itu eval digunakan:
code='var q=unescape("%27");console.log("code="+q+code+q+";eval(code)")';eval(code)
Karat
Rust menyediakan cara untuk menyertakan argumen dalam tanda kutip dalam makro cetak yang diformat. Namun, makro ini memerlukan argumen pertama makro cetak berupa string literal! Oleh karena itu yang terbaik adalah menggunakan pengidentifikasi argumen posisi:
fn main(){print!("fn main(){{print!({0:?},{0:?})}}","fn main(){{print!({0:?},{0:?})}}")}
PHP
Program PHP ini bekerja dengan cara menyimpan kode sumber dalam sebuah string dan kemudian menggunakan string tersebut printf keluaran. Itu 39 singkatan dari karakter ASCII ', untuk menangani tanda kutip dalam string dengan benar:
<?php
$code = '<?php
$code = %c%s%c;
printf($code, 39, $code, 39);
';
printf($code, 39, $code, 39);
HQ9+
Yang terakhir adalah HQ9+, yang dikembangkan oleh Cliff Biffle:
Q