Quine-programo aŭ Quine estas programo, kiu eligas sian propran fontkodon kiam ĝi estas efektivigita. Quine eble ne "paŝas ekster si mem", ekzemple, presante la enhavon de la dosiero enhavanta ĝin aŭ uzante introspektivajn kapablojn presi sian propran reprezentadon. Anstataŭe, ĝi devas kalkuli sian propran fontkodon.
La klasika maniero krei tian programon okazas en du paŝoj:
- Komencu ĉenvariablon per lokokupilo por interpolado.
- Presu la ŝnuron kaj interpolu ĝin en si mem .
La lertaĵo estas akiri la ŝnuron ĝuste. Kiel fari tion varias de lingvo al lingvo kaj dependas de kiel la variablo estas deklarita, la bezono de punktokomoj kaj novlinioj, la citiloj bezonataj, ktp. La uzo de citiloj estas interesa; Oni devas trovi manieron indiki, ke citilo estu presita sen efektive uzi citilon.
Bato
Kiel plej multaj aferoj en Bash, ĉi tiu programo uzas interesan strangaĵon. Kvankam unuopaj citiloj estas fortaj citiloj kaj ne vastigas ion ajn, interpretitaj printf
oktalaj eskapaj signoj kiel signoj kun la specifita kodpunkto:
s='s=%s;printf "$s" "$s"';printf "$s" "$s"
Pitono
En Python, la formato-specifilo revenas %r
aŭtomate unuopaj citiloj. Estas plej facile se la kodo finiĝas per novlinia signo:
s='s=%r;print(s%%s)';print(s%s)
Se vi volas la kodon sen linio-rompoj, vi devas skribi la jenon:
s='s=%r;print(s%%s,sep="")';print(s%s,sep="")
Ĝavoskripto
La jenaj JavaScript-kvinoj funkcias sub node.js. vi uzas console.log
, kiu ĉiam aldonas novan linion, do necesas nova linio ĉe la fino de ĉiu skripto:
s="s=%j;console.log(s,s)";console.log(s,s)
Ankaŭ la sekva programo estas interesa: ĝi ne presas sian tutan prezenton, sed ĝi dependas de tio, ke funkcioj havas certan prezenton.:
(function a(){console.log('('+a+')()')})()
La sekva ekzemplo estas proksima al trompado ĉar ĝi eval
uzata:
code='var q=unescape("%27");console.log("code="+q+code+q+";eval(code)")';eval(code)
Rusto
Rusto disponigas manieron enmeti argumenton inter citaĵoj en sia formatita presa makroo. Tamen, ĉi tiu makroo postulas, ke la unua argumento de la presa makroo estu ĉeno laŭvorta! Estas do plej bone uzi la pozician argumentan identigilon:
fn main(){print!("fn main(){{print!({0:?},{0:?})}}","fn main(){{print!({0:?},{0:?})}}")}
PHP
Ĉi tiu PHP-programo funkcias stokante la fontkodon en ŝnuro kaj poste uzante tiun ŝnuron printf
eliroj. La 39
signifas la ASCII-karakteron '
, por ĝuste manipuli la citaĵojn en la ĉeno:
<?php
$code = '<?php
$code = %c%s%c;
printf($code, 39, $code, 39);
';
printf($code, 39, $code, 39);
HQ9+
Laste sed ne malplej estas HQ9+, evoluigita de Cliff Biffle:
Q