একটি কুইন প্রোগ্রাম বা কুইন হল একটি প্রোগ্রাম যা কার্যকর করার সময় তার নিজস্ব সোর্স কোড আউটপুট করে। একটি কুইন "নিজের বাইরে পা নাও" হতে পারে, উদাহরণস্বরূপ, এটি ধারণকারী ফাইলের বিষয়বস্তু মুদ্রণ করে বা তার নিজস্ব প্রতিনিধিত্ব প্রিন্ট করার জন্য অন্তর্মুখী ক্ষমতা ব্যবহার করে। পরিবর্তে, এটির নিজস্ব সোর্স কোড গণনা করতে হবে।
এই ধরনের একটি প্রোগ্রাম তৈরি করার ক্লাসিক উপায় দুটি ধাপে সঞ্চালিত হয়:
- ইন্টারপোলেশনের জন্য একটি স্থানধারক সহ একটি স্ট্রিং ভেরিয়েবল শুরু করুন।
- স্ট্রিংটি প্রিন্ট করুন এবং এটিকে নিজের মধ্যে ইন্টারপোলেট করুন।
কৌশলটি হল স্ট্রিংটি সঠিকভাবে পাওয়া। এটি কীভাবে করা যায় তা ভাষা থেকে ভাষাতে পরিবর্তিত হয় এবং কীভাবে পরিবর্তনশীল ঘোষণা করা হয়, সেমিকোলন এবং নতুন লাইনের প্রয়োজন, উদ্ধৃতি চিহ্নের প্রয়োজন ইত্যাদির উপর নির্ভর করে। উদ্ধৃতি চিহ্নের ব্যবহার আকর্ষণীয়; একটি উদ্ধৃতি চিহ্ন প্রকৃতপক্ষে একটি উদ্ধৃতি চিহ্ন ব্যবহার না করে প্রিন্ট করা উচিত তা নির্দেশ করার একটি উপায় খুঁজে বের করতে হবে।
বাশ
বাশের বেশিরভাগ জিনিসের মতো, এই প্রোগ্রামটি একটি আকর্ষণীয় ব্যঙ্গ ব্যবহার করে। যদিও একক উদ্ধৃতি শক্তিশালী উদ্ধৃতি এবং কিছু প্রসারিত না, ব্যাখ্যা 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)
মরিচা
মরিচা তার বিন্যাসিত প্রিন্ট ম্যাক্রোতে উদ্ধৃতিতে একটি যুক্তি আবদ্ধ করার একটি উপায় প্রদান করে। যাইহোক, এই ম্যাক্রোর জন্য প্রিন্ট ম্যাক্রোর প্রথম আর্গুমেন্ট একটি স্ট্রিং আক্ষরিক হতে হবে! তাই পজিশনাল আর্গুমেন্ট আইডেন্টিফায়ার ব্যবহার করাই ভালো:
fn main(){print!("fn main(){{print!({0:?},{0:?})}}","fn main(){{print!({0:?},{0:?})}}")}
পিএইচপি
এই পিএইচপি প্রোগ্রামটি একটি স্ট্রিং এ সোর্স কোড সংরক্ষণ করে এবং তারপর সেই স্ট্রিং ব্যবহার করে কাজ করে printf
আউটপুট দ 39
ASCII অক্ষরের জন্য দাঁড়ায় '
, সঠিকভাবে স্ট্রিং মধ্যে উদ্ধৃতি পরিচালনা করতে:
<?php
$code = '<?php
$code = %c%s%c;
printf($code, 39, $code, 39);
';
printf($code, 39, $code, 39);
HQ9+
ক্লিফ বিফল দ্বারা বিকাশিত HQ9+ সর্বশেষ কিন্তু নয়:
Q