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:
- Miwiti variabel string kanthi placeholder kanggo interpolasi.
- Cetak string kasebut lan interpolasi menyang awake dhewe .
Trike yaiku milih string sing pas. Cara nindakake iki beda-beda saka basa siji menyang basa liyane lan gumantung saka deklarasi variabel, kebutuhan titik koma lan jeda baris, tandha petik sing dibutuhake, lan liya-liyane. Nangani tandha petik iku menarik; sampeyan kudu nemokake cara kanggo nuduhake yen tandha petik kudu dicithak tanpa nggunakake.
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=\47%s\47;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 mlaku 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