Quine ծրագիրը կամ Quine-ը ծրագիր է, որը գործարկվելիս թողարկում է իր ելակետային կոդը: Quine-ը չի կարող «դուրս գալ ինքն իրեն»՝ օրինակ տպելով այն պարունակող ֆայլի բովանդակությունը կամ օգտագործելով ներդաշնակ ունակություններ՝ տպելու իր սեփական ներկայացումը: Փոխարենը, այն պետք է հաշվարկի իր սկզբնական կոդը:
Նման ծրագիր ստեղծելու դասական եղանակը տեղի է ունենում երկու քայլով:
- Նախաձեռնեք տողային փոփոխական՝ ինտերպոլացիայի համար տեղապահով:
- Տպեք տողը և ներդիր այն իր մեջ :
Խնդիրն այն է, որ լարը ճիշտ ստանա: Ինչպես դա անել, տարբերվում է լեզվից լեզու և կախված է նրանից, թե ինչպես է հայտարարագրվում փոփոխականը, ստորակետերի և նոր տողերի անհրաժեշտությունը, պահանջվող չակերտները և այլն: Հետաքրքիր է չակերտների օգտագործումը. Պետք է ճանապարհ գտնել՝ ցույց տալու, որ չակերտը պետք է տպվի առանց չակերտի իրականում օգտագործելու:
Բաշ
Ինչպես 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