برنامه Quine یا Quine برنامه ای است که هنگام اجرا کد منبع خود را خروجی می دهد. یک کواین نمیتواند با چاپ کردن محتویات فایل حاوی آن یا استفاده از تواناییهای دروننگر برای چاپ نمایش خود، «از خود خارج شود». در عوض، باید کد منبع خود را محاسبه کند.
روش کلاسیک برای ایجاد چنین برنامه ای در دو مرحله انجام می شود:
- یک متغیر رشته را با یک مکان نگهدار برای درون یابی راه اندازی کنید.
- رشته را پرینت بگیرید و آن را درون خودش قرار دهید.
ترفند این است که رشته را درست به دست آورید. نحوه انجام این کار از زبانی به زبان دیگر متفاوت است و به نحوه اعلان متغیر، نیاز به نقطه ویرگول و خطوط جدید، علامت نقل قول مورد نیاز و غیره بستگی دارد. استفاده از علامت نقل قول جالب است. باید راهی پیدا کرد که نشان دهد یک علامت نقل قول باید بدون استفاده از علامت نقل قول چاپ شود.
ضربه شدید
مانند بسیاری از چیزها در Bash، این برنامه از یک ویژگی جالب استفاده می کند. هر چند تک نقل قول ها نقل قول های قوی هستند و چیزی را گسترش نمی دهند، تفسیر شده اند printf
کاراکترهای فرار هشتگانه به عنوان کاراکترهایی با نقطه کد مشخص شده:
s='s=%s;printf "$s" "$s"';printf "$s" "$s"
پایتون
در پایتون، فرمت مشخص کننده برمی گردد %r
نقل قول به صورت خودکار اگر کد با یک کاراکتر خط جدید ختم شود، سادهترین کار است:
s='s=%r;print(s%%s)';print(s%s)
اگر کد بدون خط شکسته می خواهید، باید موارد زیر را بنویسید:
s='s=%r;print(s%%s,sep="")';print(s%s,sep="")
جاوا اسکریپت
کدهای جاوا اسکریپت زیر تحت 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