Quine

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:

  1. Inisialisasi variabel string dengan placeholder untuk interpolasi.
  2. Cetak string tersebut dan interpolasi ke dalam dirinya sendiri .

Kuncinya adalah memilih string yang tepat. Cara melakukannya bervariasi dari satu bahasa ke bahasa lain dan bergantung pada deklarasi variabel, kebutuhan akan titik koma dan pemisah baris, tanda kutip yang dibutuhkan, dan sebagainya. Menangani tanda kutip itu menarik; Anda harus menemukan cara untuk menunjukkan bahwa tanda kutip harus dicetak tanpa benar-benar menggunakannya.

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, jadi baris baru diperlukan 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
Kembali