Quine

Program Quine atau Quine ialah program yang mengeluarkan kod sumbernya sendiri apabila dilaksanakan. Quine tidak boleh "melangkah keluar dari dirinya sendiri" dengan, sebagai contoh, mencetak kandungan fail yang mengandunginya atau menggunakan kebolehan introspektif untuk mencetak representasinya sendiri. Sebaliknya, ia perlu mengira kod sumbernya sendiri.


Cara klasik untuk mencipta program sedemikian berlaku dalam dua langkah:

  1. Mulakan pembolehubah rentetan dengan pemegang tempat untuk interpolasi.
  2. Cetak rentetan dan interpolasi ke dalam dirinya sendiri .

Caranya ialah untuk mendapatkan rentetan yang betul. Cara melakukan ini berbeza dari bahasa ke bahasa dan bergantung pada cara pembolehubah diisytiharkan, keperluan untuk koma bertitik dan baris baharu, tanda petikan yang diperlukan, dsb. Penggunaan tanda petikan adalah menarik; Seseorang itu perlu mencari cara untuk menunjukkan bahawa tanda petikan harus dicetak tanpa menggunakan tanda petikan.

Bash

Seperti kebanyakan perkara dalam Bash, program ini menggunakan kebiasaan yang menarik. Walaupun petikan tunggal adalah petikan yang kuat dan tidak mengembangkan apa-apa, ditafsirkan printf aksara pelarian oktal sebagai aksara dengan titik kod yang ditentukan:

s='s=%s;printf "$s" "$s"';printf "$s" "$s"

Ular sawa

Dalam Python, penentu format kembali %r petikan tunggal secara automatik. Ia paling mudah jika kod berakhir dengan aksara baris baharu:

s='s=%r;print(s%%s)';print(s%s)

Jika anda mahukan kod tanpa pemisah baris, anda perlu menulis perkara berikut:

s='s=%r;print(s%%s,sep="")';print(s%s,sep="")

JavaScript

Kui JavaScript berikut dijalankan di bawah node.js. anda gunakan console.log, yang sentiasa menambahkan baris baharu, jadi baris baharu diperlukan pada penghujung setiap skrip:

s="s=%j;console.log(s,s)";console.log(s,s)

Program berikut juga menarik: ia tidak mencetak keseluruhan perwakilannya, tetapi ia bergantung pada fakta bahawa fungsi mempunyai perwakilan tertentu:

(function a(){console.log('('+a+')()')})()

Contoh seterusnya adalah dekat dengan menipu kerana ia eval digunakan:

code='var q=unescape("%27");console.log("code="+q+code+q+";eval(code)")';eval(code)

Karat

Rust menyediakan cara untuk menyertakan hujah dalam petikan dalam makro cetakan terformatnya. Walau bagaimanapun, makro ini memerlukan hujah pertama makro cetakan menjadi rentetan literal! Oleh itu, adalah lebih baik untuk menggunakan pengecam hujah kedudukan:

fn main(){print!("fn main(){{print!({0:?},{0:?})}}","fn main(){{print!({0:?},{0:?})}}")}

PHP

Program PHP ini berfungsi dengan menyimpan kod sumber dalam rentetan dan kemudian menggunakan rentetan itu printf keluaran. The 39 bermaksud aksara ASCII ', untuk mengendalikan petikan dalam rentetan dengan betul:

<?php
$code = '<?php
$code = %c%s%c;
printf($code, 39, $code, 39);
';
printf($code, 39, $code, 39);

HQ9+

Akhir sekali ialah HQ9+, dibangunkan oleh Cliff Biffle:

Q
Belakang