Un program Quine sau Quine este un program care scoate propriul cod sursă atunci când este executat. Un Quine nu poate „păși în afara lui însuși”, de exemplu, imprimând conținutul fișierului care îl conține sau folosind abilitățile introspective pentru a-și tipări propria reprezentare. În schimb, trebuie să calculeze propriul cod sursă.
Modul clasic de a crea un astfel de program are loc în doi pași:
- Inițializați o variabilă șir cu un substituent pentru interpolare.
- Afișează șirul de caractere și interpolează-l în el însuși .
Secretul constă în alegerea șirului de caractere potrivit. Modul de a face acest lucru variază de la un limbaj la altul și depinde de declararea variabilelor, de necesitatea punctului și virgulei și a sfârșiturilor de linie, de ghilimelele necesare și așa mai departe. Gestionarea ghilimelelor este interesantă; trebuie să găsești o modalitate de a indica faptul că un ghilimel ar trebui afișat fără a utiliza de fapt unul.
Bash
La fel ca majoritatea lucrurilor din Bash, acest program folosește o ciudatenie interesantă. Deși ghilimele simple sunt ghilimele puternice și nu extind nimic, interpretat printf caractere de escape octale ca caractere cu punctul de cod specificat:
s='s=\47%s\47;printf "$s" "$s"';printf "$s" "$s"
Piton
În Python, se întoarce specificatorul de format %r automat ghilimele simple. Este mai ușor dacă codul se termină cu un caracter de linie nouă:
s='s=%r;print(s%%s)';print(s%s)
Dacă doriți codul fără întreruperi de linie, trebuie să scrieți următoarele:
s='s=%r;print(s%%s,sep="")';print(s%s,sep="")
JavaScript
Următoarele elemente JavaScript rulează pe Node.js. folosesti console.log, care adaugă întotdeauna o nouă linie, deci este necesară o nouă linie la sfârșitul fiecărui script:
s="s=%j;console.log(s,s)";console.log(s,s)
Interesant este și următorul program: nu își imprimă întreaga reprezentare, dar se bazează pe faptul că funcțiile au o anumită reprezentare:
(function a(){console.log('('+a+')()')})()
Următorul exemplu este aproape de înșelăciune deoarece asta eval folosit:
code='var q=unescape("%27");console.log("code="+q+code+q+";eval(code)")';eval(code)
Rugini
Rust oferă o modalitate de a include un argument între ghilimele în macrocomanda de imprimare formatată. Cu toate acestea, această macrocomandă necesită ca primul argument al macrocomenzii de tipărire să fie un șir literal! Prin urmare, cel mai bine este să utilizați identificatorul de argument pozițional:
fn main(){print!("fn main(){{print!({0:?},{0:?})}}","fn main(){{print!({0:?},{0:?})}}")}
PHP
Acest program PHP funcționează prin stocarea codului sursă într-un șir și apoi folosind acel șir printf iesiri. The 39 reprezintă caracterul ASCII ', pentru a trata corect ghilimelele din șir:
<?php
$code = '<?php
$code = %c%s%c;
printf($code, 39, $code, 39);
';
printf($code, 39, $code, 39);
HQ9+
Nu în ultimul rând este HQ9+, dezvoltat de Cliff Biffle:
Q