Քուայն

Quine ծրագիրը կամ Quine-ը ծրագիր է, որը գործարկվելիս թողարկում է իր ելակետային կոդը: Quine-ը չի կարող «դուրս գալ ինքն իրեն»՝ օրինակ տպելով այն պարունակող ֆայլի բովանդակությունը կամ օգտագործելով ներդաշնակ ունակություններ՝ տպելու իր սեփական ներկայացումը: Փոխարենը, այն պետք է հաշվարկի իր սկզբնական կոդը:


Նման ծրագիր ստեղծելու դասական եղանակը տեղի է ունենում երկու քայլով:

  1. Նախաձեռնեք տողային փոփոխական՝ ինտերպոլացիայի համար տեղապահով:
  2. Տպեք տողը և ներդիր այն իր մեջ :

Խնդիրն այն է, որ լարը ճիշտ ստանա: Ինչպես դա անել, տարբերվում է լեզվից լեզու և կախված է նրանից, թե ինչպես է հայտարարագրվում փոփոխականը, ստորակետերի և նոր տողերի անհրաժեշտությունը, պահանջվող չակերտները և այլն: Հետաքրքիր է չակերտների օգտագործումը. Պետք է ճանապարհ գտնել՝ ցույց տալու, որ չակերտը պետք է տպվի առանց չակերտի իրականում օգտագործելու:

Բաշ

Ինչպես Bash-ի շատ բաներ, այս ծրագիրը նույնպես օգտագործում է հետաքրքիր տարօրինակություն: Թեև առանձին մեջբերումները ուժեղ մեջբերումներ են և ոչինչ չեն ընդլայնում, մեկնաբանված printf octal escape նիշերը որպես նիշեր՝ նշված կոդային կետով:

s='s=%s;printf "$s" "$s"';printf "$s" "$s"

Պիթոն

Python-ում վերադառնում է ձևաչափի ցուցիչը %r ինքնաբերաբար միայնակ մեջբերումներ: Ամենահեշտն է, եթե կոդը ավարտվում է նոր տողով:

s='s=%r;print(s%%s)';print(s%s)

Եթե ցանկանում եք կոդը առանց տողերի ընդմիջումների, ապա պետք է գրեք հետևյալը:

s='s=%r;print(s%%s,sep="")';print(s%s,sep="")

JavaScript

Հետևյալ JavaScript quines-ները աշխատում են node.js-ի տակ: դուք օգտագործում եք console.log, որը միշտ նոր տող է ավելացնում, ուստի յուրաքանչյուր սցենարի վերջում անհրաժեշտ է նոր տող:

s="s=%j;console.log(s,s)";console.log(s,s)

Հետաքրքիր է նաև հետևյալ ծրագիրը. այն չի տպում իր ամբողջ ներկայացումը, բայց հիմնվում է այն փաստի վրա, որ գործառույթներն ունեն որոշակի ներկայացում։:

(function a(){console.log('('+a+')()')})()

Հաջորդ օրինակը մոտ է խաբելուն, քանի որ դա eval օգտագործված:

code='var q=unescape("%27");console.log("code="+q+code+q+";eval(code)")';eval(code)

Ժանգը

Rust-ն իր ձևաչափված տպագիր մակրոյում արգումենտը չակերտների մեջ փակելու միջոց է տալիս: Այնուամենայնիվ, այս մակրոն պահանջում է, որ տպագիր մակրոյի առաջին արգումենտը լինի տողային բառացի: Ուստի ավելի լավ է օգտագործել դիրքային փաստարկի նույնացուցիչը:

fn main(){print!("fn main(){{print!({0:?},{0:?})}}","fn main(){{print!({0:?},{0:?})}}")}

PHP

Այս PHP ծրագիրը աշխատում է աղբյուրի կոդը պահելով տողի մեջ և այնուհետև օգտագործելով այդ տողը printf ելքեր։ Այն 39 հանդես է գալիս որպես ASCII նիշ ', տողի մեջ չակերտները ճիշտ մշակելու համար:

<?php
$code = '<?php
$code = %c%s%c;
printf($code, 39, $code, 39);
';
printf($code, 39, $code, 39);

HQ9+

Վերջին, բայց ոչ պակաս կարևորը HQ9+-ն է, որը մշակվել է Cliff Biffle-ի կողմից:

Q
Վերադառնալ