Quine

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:

  1. Inițializați o variabilă șir cu un substituent pentru interpolare.
  2. Imprimați șirul și interpolați-l în sine .

Trucul este să obțineți șirul corect. Cum se face acest lucru variază de la o limbă la alta și depinde de modul în care este declarată variabila, de necesitatea punctului și virgulă și a liniilor noi, de ghilimelele necesare etc. Utilizarea ghilimelelor este interesantă; Trebuie să găsiți o modalitate de a indica faptul că un ghilimele trebuie tipărit fără a utiliza efectiv un ghilimele.

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=%s;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ă sub 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
Înapoi