Quine

Program Quine utawa Quine minangka program sing ngasilake kode sumber dhewe nalika dieksekusi. A Quine bisa uga ora "melangkah njaba dhewe" kanthi, contone, nyithak isi file sing ngemot utawa nggunakake kemampuan introspektif kanggo nyithak perwakilan dhewe. Nanging, kudu ngetung kode sumber dhewe.


Cara klasik kanggo nggawe program kasebut dumadi ing rong langkah:

  1. Miwiti variabel string kanthi placeholder kanggo interpolasi.
  2. Print string lan interpolasi menyang dhewe .

Trik kanggo njaluk senar sing tepat. Cara nindakake iki beda-beda saka basa menyang basa lan gumantung carane variabel kasebut diumumake, perlu kanggo titik koma lan baris anyar, tandha petik sing dibutuhake, lsp. Panganggone tanda petik menarik; Siji kudu golek cara kanggo nunjukake yen tandha petik kudu dicithak tanpa nggunakake tanda petik.

Bash

Kaya umume ing Bash, program iki nggunakake quirk sing menarik. Senajan kuotasi siji kuotasi kuwat lan ora nggedhekake apa-apa, Juru printf karakter uwal octal minangka karakter karo titik kode kasebut:

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

Python

Ing Python, format specifier bali %r otomatis kuotasi siji. Paling gampang yen kode rampung karo karakter baris anyar:

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

Yen sampeyan pengin kode tanpa baris break, sampeyan kudu nulis ing ngisor iki:

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

JavaScript

Quine JavaScript ing ngisor iki mbukak ing node.js. sampeyan nggunakake console.log, kang tansah appends baris anyar, supaya baris anyar dibutuhake ing mburi saben script:

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

Program ing ngisor iki uga menarik: ora nyithak kabeh perwakilan, nanging gumantung ing kasunyatan manawa fungsi duwe perwakilan tartamtu.:

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

Conto sabanjure cedhak mbeling amarga iku eval digunakake:

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

Teyeng

Rust nyedhiyakake cara kanggo nyakup argumen ing kuotasi ing makro cetak sing diformat. Nanging, makro iki mbutuhake argumen pisanan saka makro print dadi string literal! Mulane paling apik nggunakake pengenal argumentasi posisional:

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

PHP

Program PHP iki dianggo kanthi nyimpen kode sumber ing senar banjur nggunakake senar kasebut printf output. Ing 39 stands kanggo karakter ASCII ', kanggo bener nangani kuotasi ing senar:

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

HQ9+

Paling pungkasan nanging paling ora HQ9 +, dikembangake dening Cliff Biffle:

Q
Bali