برنامج Quine أو 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="")
جافا سكريبت
تعمل خطوط JavaScript التالية ضمن 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 هذا عن طريق تخزين الكود المصدري في سلسلة ثم استخدام تلك السلسلة 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