Një program Quine ose Quine është një program që nxjerr kodin e tij burimor kur ekzekutohet. Një Quine nuk mund të "dalë jashtë vetvetes", për shembull, duke shtypur përmbajtjen e skedarit që e përmban atë ose duke përdorur aftësi introspektive për të printuar përfaqësimin e tij. Në vend të kësaj, ajo duhet të llogarisë kodin e vet burimor.
Mënyra klasike për të krijuar një program të tillë zhvillohet në dy hapa:
- Inicializoni një variabël vargu me një vendmbajtes për interpolim.
- Shtypni vargun dhe ndërfuqini atë në vetvete .
Truku është që të merrni vargun ashtu siç duhet. Mënyra se si bëhet kjo ndryshon nga gjuha në gjuhë dhe varet nga mënyra se si deklarohet ndryshorja, nevoja për pikëpresje dhe vija të reja, thonjëzat e kërkuara, etj. Përdorimi i thonjëzave është interesant; Duhet gjetur një mënyrë për të treguar se thonjëza duhet të shtypet pa përdorur në fakt thonjëza.
Bash
Ashtu si shumica e gjërave në Bash, ky program përdor një veçori interesante. Megjithëse thonjëzat teke janë thonjëza të forta dhe nuk zgjerojnë asgjë, të interpretuara printf Karakteret e ikjes oktal si karaktere me pikën e specifikuar të kodit:
s='s=\47%s\47;printf "$s" "$s"';printf "$s" "$s"
Piton
Në Python, specifikuesi i formatit kthehet %r automatikisht citate të vetme. Është më e lehtë nëse kodi përfundon me një karakter të linjës së re:
s='s=%r;print(s%%s)';print(s%s)
Nëse dëshironi kodin pa ndërprerje rreshtash, duhet të shkruani sa më poshtë:
s='s=%r;print(s%%s,sep="")';print(s%s,sep="")
JavaScript
Kuinat e mëposhtme të JavaScript ekzekutohen nën node.js. ju përdorni console.log, e cila gjithmonë shton një rresht të ri, kështu që nevojitet një rresht i ri në fund të çdo skenari:
s="s=%j;console.log(s,s)";console.log(s,s)
Programi i mëposhtëm është gjithashtu interesant: ai nuk e printon të gjithë paraqitjen e tij, por mbështetet në faktin se funksionet kanë një paraqitje të caktuar:
(function a(){console.log('('+a+')()')})()
Shembulli tjetër është afër mashtrimit sepse është eval të përdorura:
code='var q=unescape("%27");console.log("code="+q+code+q+";eval(code)")';eval(code)
Ndryshk
Rust ofron një mënyrë për të mbyllur një argument në thonjëza në makro të printimit të formatuar. Sidoqoftë, kjo makro kërkon që argumenti i parë i makros së printimit të jetë një varg literal! Prandaj është më mirë të përdoret identifikuesi i argumentit pozicional:
fn main(){print!("fn main(){{print!({0:?},{0:?})}}","fn main(){{print!({0:?},{0:?})}}")}
PHP
Ky program PHP funksionon duke ruajtur kodin burim në një varg dhe më pas duke përdorur atë varg printf daljet. Të 39 qëndron për karakterin ASCII ', për të trajtuar saktë thonjëzat në varg:
<?php
$code = '<?php
$code = %c%s%c;
printf($code, 39, $code, 39);
';
printf($code, 39, $code, 39);
HQ9+
E fundit, por jo më pak e rëndësishme është HQ9+, e zhvilluar nga Cliff Biffle:
Q