Quine

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:

  1. Inicializoni një variabël vargu me një vendmbajtes për interpolim.
  2. Printo vargun dhe interpoloje atë në vetvete .

Hileja është zgjedhja e vargut të duhur. Mënyra se si bëhet kjo ndryshon nga gjuha në gjuhë dhe varet nga deklarimi i variablave, nevoja për pikëpresje dhe ndërprerje rreshtash, shenjat e kërkuara të thonjëzave e kështu me radhë. Trajtimi i shenjave të thonjëzave është interesant; duhet të gjesh një mënyrë për të treguar se një shenjë thonjëzash duhet të shtypet pa përdorur një të tillë.

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, i cili gjithmonë shton një rresht të ri, kështu që nevojitet një rresht i ri në fund të çdo skripti.:

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
Mbrapa