কুইন লেখার টিপস


30

একটি এমন একটি প্রোগ্রাম যা আউটপুট উত্পাদন করে যা প্রোগ্রামের উত্স কোডের মতো। এই ওয়েবসাইটে আমরা সাধারণত সঠিক কুইনগুলি সম্পর্কে যত্নশীল (লেখার সময় বর্তমান সংজ্ঞাটি "আউটপুটটির কিছু অংশ প্রোগ্রামের একটি পৃথক অংশ দ্বারা এনকোড করা হয়")।

সঠিক কুইন, বা কোয়েনের মতো বৈশিষ্ট্যযুক্ত প্রোগ্রামগুলি লেখার জন্য আপনার কী পরামর্শ রয়েছে? যথারীতি, প্রতিটি টিপ পৃথক উত্তরে থাকতে হবে।

tips  quine 

উত্তর:


14

evalকোড কপি করার প্রয়োজন হ্রাস করতে ব্যবহার করুন

বেশিরভাগ কুইনের কোডের দুটি কপি প্রয়োজন; একটি মৃত্যুদন্ড কার্যকর করা হবে, একটি তথ্য হিসাবে। এটি সোর্স কোডটির দৈর্ঘ্য দ্বিগুণ করে শেষ করতে পারে, এটি বজায় রাখা আরও শক্ত করে তোলে এবং আপনি যদি কোনও প্রতিযোগিতার জন্য কুইন লিখছেন তবে স্কোরকে আরও খারাপ করে তুলবে ।

দুটি অনুলিপি মার্জ করার অর্থ হ'ল এক টুকরো তথ্য দুটি উদ্দেশ্যে ব্যবহার করা দরকার। আপনার কোডটিকে ডেটা হিসাবে ব্যবহার করার চেষ্টা করা প্রায়শই সম্ভব নয় এবং সাধারণত এটি প্রতারণার হিসাবে বিবেচিত হয়। কোড হিসাবে ডেটা চিকিত্সা করা, তবে বিল্টিন ব্যবহারের মাধ্যমে অনেক ভাষায় করা যেতে পারে, সাধারণত বলা হয় eval। যেমন, আপনার কুইনটি মূলত আপনার কোয়েনের মূল দেহটি একটি ভেরিয়েবলের মধ্যে সঞ্চয় করে (যাতে আপনি এটি একাধিকবার উল্লেখ করতে পারেন), তারপরে সেই পরিবর্তনশীলটি মূল্যায়ন করে।

এটি কীভাবে কাজ করে তার একটি উদাহরণ এখানে রয়েছে (উদাহরণটি পাইথনে লেখা আছে, তবে অন্যান্য অনেক ভাষায় অনুরূপ কিছু কাজ করে):

d='print("d="+repr(d)+"\\neval(d)")'
eval(d)

2
@ কিপ্যায়েট্যাক্সস: আমার লক্ষ্য এখানে আমার কোডটি পাঠযোগ্য এবং রক্ষণযোগ্য হিসাবে বিজয় শর্তের অনুমতি দেয়। দুর্ভাগ্যক্রমে, এটি এখনও সাধারণত ASCII লাইন শোর (বা আমি জেলি ব্যবহার করছি যদি কেবল নিয়মিত লাইন শোর) থেকে ভাষা ব্যবহার হয় না এমন লোকদের থেকে পৃথক করা যায়।

14

স্ট্রিং ফর্ম্যাটিংয়ের সুবিধা নিন

কুইন তৈরির অন্যতম সহজ উপায় হ'ল স্ট্রিং সংজ্ঞায়িত করা, তারপরে স্ট্রিং ফর্ম্যাটিংয়ের সাথে স্ট্রিংটি নিজের ভিতরে রাখুন।

s='s=%r;print s%%s';print s%s

সুতরাং উদাহরণস্বরূপ পাইথন কুইন, আমরা স্ট্রিংয়ের আগে যা আছে তার সমান প্রথম অংশের সাথে একটি স্ট্রিং ঘোষণা করি s=, তারপরে আমরা স্ট্রিংটি বিন্যাসের সাথে সন্নিবেশ করার অনুমতি দিই %rএবং অবশেষে স্ট্রিংয়ের পরে যা আসে তা মুদ্রণ এবং বিন্যাসে রাখি we । পেছনের নিউলাইনটি হ'ল কারণ printএকটি ট্রেলিং করা নিউলাইন।

সুতরাং টেমপ্লেটটি সত্যই পাইথনে:

<A>'<A>%r<B>'<B>

আরও কোড সহ বিদ্যমান কুইন প্রসারিত করতে:

<more A>s='<more A>s=%r;print s%%s<more B>';print s%s<more B>

9

স্ট্রিংফাইড ফাংশন

বেশ কয়েকটি ভাষায়, ফাংশন অবজেক্টস (বা সমমানের কনস্ট্রাক্টস) স্পষ্টতই তাদের উত্স কোড সঞ্চয় করে এবং স্ট্রিংয়ে রূপান্তরিত হলে এটিকে ফিরিয়ে দেয়। এটি স্ট্রিং ইভাল ব্যবহার না করে কমপ্যাক্ট কুইনগুলিকে অনুমতি দেয় । এই জাতীয় ভাষার একটি উল্লেখযোগ্য উদাহরণ জাভাস্ক্রিপ্ট:

function f(){console.log(f+"f()")}f()

এই কোডটি একটি ফাংশন সংজ্ঞায়িত করে এবং কল fকরে, যখন ডাকা হয়, তার নিজস্ব উত্স কোড মুদ্রণ করে তার পরে নিজেই একটি কল call প্রোগ্রামটির একমাত্র অংশ যা ডুপ্লিকেট করা প্রয়োজন তা হ'ল ফাংশন কল f()। অবশ্যই, ফাংশন বডিটিতে কোডের একটি স্বেচ্ছাচারিত "পেলোড" অন্তর্ভুক্ত করা যেতে পারে যা ফাংশন বলা হয়ে গেলে কার্যকর করা হবে।


একই কৌশলটির আরও কমপ্যাক্ট সংস্করণ গল্ফিং ভাষাগুলি গল্ফস্ক্রিপ্টে কাজ করে :

{".~"}.~

এবং সিজেএম :

{"_~"}_~

এই কুইনগুলির প্রত্যেকটি প্রথমে একটি বেনামি কোড ব্লক (ধনুর্বন্ধনীগুলিতে বদ্ধ) সংজ্ঞায়িত করে, যা জাভাস্ক্রিপ্টে কোনও ফাংশন অবজেক্টের মতো আচরণ করে: এটি কার্যকর করা যেতে পারে এবং যদি স্ট্রাইটিং করা হয় তবে এটি তার উত্স কোডটি ফিরিয়ে দেয়। বাকী কোডটি ( .~গল্ফস্ক্রিপ্টে বা _~সিজেমে) এর পরে স্টকটিতে একটি অনুলিপি রেখে ব্লকটি কার্যকর করে। ব্লকের অভ্যন্তরের কোডটি স্ট্যাকের উপরে একটি স্ট্রিং ঠেলে দেয় যা ব্লকের বাইরে কোডটি পুনরাবৃত্তি করে। দোভাষী যখন প্রস্থান করেন, তখন এটি স্বয়ংক্রিয়ভাবে স্ট্যাকের বাকী সমস্ত জিনিসগুলিকে স্ট্রিংফাইজ করে এবং মুদ্রণ করে। জাভাস্ক্রিপ্ট উদাহরণ হিসাবে, এই কোড ব্লকগুলি অনুলিপি না করে অতিরিক্ত কোডের একটি স্বেচ্ছাসেবী পেলোড বহন এবং সম্পাদন করতে পারে।


9

স্ট্রিং ডিলিমিটারগুলি ব্যবহার করুন যা এড়ায় না est

প্রায়শই, কুইন লেখা সম্পর্কে একটি শক্ত অংশ হ'ল পালানোর পদক্ষেপ। এটি প্রায় প্রতিটি কুইনে প্রয়োজন; সমস্যাটি হ'ল আপনি কোনওভাবে ডেটা সংরক্ষণ করছেন এবং আপনার কোডটি প্রতিলিপি করা দরকার যা কোণের আউটপুটে ডেটা সঞ্চয় করে। এই কোডটিতে ডেটাটির একটি পালানো ফর্ম থাকবে, সুতরাং প্রোগ্রামটি একটি অনির্বাচিত ফর্ম দেখতে পাবে এবং আপনাকে এটির পুনরায় পালাতে হবে।

অনস্কেপিং পদক্ষেপটি হ্যান্ডেল করার সহজতম উপায় হ'ল যদি স্ট্রিং ডিলিমিটারগুলির উপস্থিতি বা অনুপস্থিতিতে ডেটা থেকে পালানো এবং অপরিবর্তিত ফর্মগুলি পৃথক হয়। এস্কেপিং স্ট্রিংয়ের চারপাশে একটি নতুন জোড়া স্ট্রিং ডিলিমিটার যুক্ত করার একটি সহজ বিষয়। দুর্ভাগ্যক্রমে, এটি স্পষ্টভাবে কেবল তখনই কাজ করতে পারে যদি স্ট্রিং ডিলিমিটররা নিজেরাই এড়িয়ে না গিয়ে ডেটাতে প্রকাশ করতে পারে।

পার্ল একটি ভাষার উদাহরণ যেখানে এই কৌশলটি কাজ করে। যদিও এর স্বাভাবিক স্ট্রিং ডিলিমিটারগুলি হয় "…"বা '…'কম ব্যবহৃত সাধারণত q(…)নীড়গুলি, এই ধরণের কুইনকে লেখার অনুমতি দেয়:

$_=q($_=q(0);s/\d/$_/;print);s/\d/$_/;print

এটি একটি কোড + ডেটা কুইন। s///একটি রেজেক্স স্ট্রিং-রিপ্লেসম অপারেশন; আমরা 0মার্কার হিসাবে ব্যবহার করি এবং \dএকাধিকবার মার্কার ব্যবহার এড়াতে ("অন্য কোনও সংখ্যক") হিসাবে এটি রেগেক্সের সাথে মিলিয়ে দেখি (যদিও অন্য অপটিমাইজেশন হিসাবে আমরা আসলে 0আবার ব্যবহার করতে পারতাম , কারণ পার্ল s///কেবলমাত্র প্রথম ঘটনাকে প্রতিস্থাপন করে ডিফল্ট). নোট করুন যে এখানে স্পষ্টভাবে পালানোর কোনও পদক্ষেপের প্রয়োজন নেই, কারণ q(…)ডিলিমিটরগুলি কেবল ডাটা স্ট্রিংয়ে আক্ষরিকভাবে অন্তর্ভুক্ত হতে পারে।


8

কোড + ডেটা কুইন

একটি কুইনের জন্য সর্বাধিক সাধারণ কাঠামোটি এই সিউডোকোডের মতো কিছু দেখায়:

ডেটা = " পুরো প্রোগ্রামটির একটি পালানো সংস্করণ,
        এই স্ট্রিংটি একটি চিহ্নিতকারী দ্বারা প্রতিস্থাপিত "
প্রোগ্রাম = তথ্য.প্লেস (
  একটি অভিব্যক্তি যা চিহ্নিতকারীকে মূল্যায়ন করে তবে এটি উল্লেখ করে না ,
  পলান (ডাটা))
মুদ্রণ প্রোগ্রাম;

এই কাঠামোটি বেশিরভাগ ভাষায় একটি (মোটামুটি নিষ্পাপ) কুইন লিখতে ব্যবহার করা যেতে পারে। তবে এটি বেশিরভাগ স্কোরিং সিস্টেমে মোটামুটিভাবে খারাপ স্কোর করতে ঝোঁক দেয় কারণ আপনাকে প্রোগ্রামের পুরোপুরি দু'বার লিখতে হবে। তবে বেশিরভাগ কুইন স্ট্রাকচারকে এটির অপ্টিমাইজেশন হিসাবে বিবেচনা করা যেতে পারে।

এর কিছু সূক্ষ্মতা রয়েছে। কিছু ভাষায়, এই ক্রিয়াকলাপটি সম্পাদনের সবচেয়ে শক্ত অংশটি হ'ল পালানোর কোডটি লেখা; অনেক ভাষায়, নামটির উল্লেখ না করে চিহ্নিতকারী উত্পাদন করা কঠিন; এবং কিছু গৌণ ভাষায়, আপনাকে নিজের ধরণের স্ট্রিং আক্ষরিক উদ্ভাবন করতে হবে। যদিও তিনটি অপারেশনই খুব বেশি সমস্যা সৃষ্টি করে না।

উদাহরণস্বরূপ, আমরা পাইথন কুইনটি স্ট্রিং থেকে বেরিয়ে reprএবং 2-অক্ষর-ক্রম ব্যবহার করে লিখতে পারিx" স্ট্রিংটি (যা প্রতিনিধিত্বযোগ্য "x\"", যেমন x"স্ট্রিংয়ের স্ট্রিং উপস্থাপনায় ক্রমটি ব্যবহার না করে ) চিহ্নিতকারী হিসাবে ব্যবহার করে:

d='d=x"\nprint(str.replace(d,"x\\"",repr(d)))'
print(str.replace(d,"x\"",repr(d)))

2
এটি লক্ষণীয় (সম্ভবত অন্য উত্তরে) মূল্যবান হতে পারে যে একটি মার্কারের অবস্থানে স্ট্রিং tingোকানো প্রায়শই এসোলেংগুলিতে ব্যয়বহুল, এবং কোডটি কাঠামোগত করার জন্য এটি স্ট্রিং নিজেই প্রথম বা শেষ জিনিস হতে পারে (সম্ভবত এটি থেকে পৃথক করা হয়েছে) এক বা দুটি অক্ষর দ্বারা শেষ হয় যা আপনি হার্ডকোড করতে পারেন) যাতে আপনি জানেন যে এটি কোথায় যেতে হবে।
মার্টিন এন্ডার

@ মার্টিনএেন্ডার: আমি সম্মত হই যে এটি উল্লেখ করার মতো, তবে এটি সম্ভবত অন্য একটি উত্তর (এই উত্তরে মন্তব্য বা সম্পাদনার চেয়ে)। বেশিরভাগ কুইন টিপস হ'ল এই সাধারণ কাঠামোর পরিবর্তন,

একটি চিহ্নিতকারী একটি বিকল্প আমি যে জন্য, দুটি স্ট্রিং ব্যবহার করা গ্লাস
janrjan জোহানসেন

4

মোড়ানোর উত্স কোডটি শোষণ করুন

বেশ কয়েকটি ভাষায় (বেশিরভাগ 2D ভাষা), উত্স কোডটি প্রায় মোড়ানো করতে পারে; নির্দিষ্ট পরিস্থিতিতে (যেমন বেফুঞ্জ -৯৮ এ, যদি আপনার প্রোগ্রামটি যদি একটি লাইনার থাকে) প্রোগ্রামের শেষের দিকে যেতে আপনাকে প্রোগ্রামের শুরুতে ফিরে নিয়ে যায়। এই জাতীয় অরৈখিক আচরণের অর্থ আপনি একই সাথে একটি স্ট্রিং আক্ষরিক ভিতরে এবং বাইরে যে কোডটি লিখতে পারেন; একটি মিল নেই "(বা স্ট্রিং ডিলিমিটার যাই হোক না কেন) কার্যকরভাবে আপনাকে স্ট্রিংটি বাকী প্রোগ্রামের পুরো অংশটি ( "নিজেই বাদে ) দেবে।

এই কৌশলটি ব্যবহার করে একটি সমস্যা হ'ল আপনি যে স্ট্রিংটি দৃষ্টিকোণ থেকে দেখেন তেমন পাবেন " প্রোগ্রামটি শুরু করার পরিবর্তে (যেমনটি আপনি চাইছেন) চেয়ে । এই হিসাবে, প্রোগ্রামটি পুনরায় সাজানো সম্ভবত এটি সবচেয়ে সহজ যাতে "এটি শুরু বা শেষের দিকে উপস্থিত হয়। এর অর্থ হ'ল আপনার প্রোগ্রামটি একাধিক টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো

একটি ভাল উদাহরণ হ'ল @ জাস্টিনের বেফুঞ্জ -98 কুইন :

<@,+1!',k9"

"প্রোগ্রামের শেষের সাথে অতুলনীয় পুরো প্রোগ্রামটিকে একটি স্ট্রিং লিটারে আবৃত করে, সুতরাং ( <শুরুতে ডান থেকে বামে চালানো ) আমাদের যা করতে হবে তা হল প্রোগ্রাম আউটপুট ( 9k), তারপরে ডাবল উদ্ধৃতি ( '!1+,) এবং আউটপুট প্রস্থান ( @)। এটি প্রোগ্রামের দুটি অনুলিপি (কোড হিসাবে একটি, ডেটা হিসাবে একটি) প্রয়োজন সংরক্ষণ করে; দুটি অনুলিপি একই কোডের টুকরো, বিভিন্নভাবে ব্যাখ্যা করা।


4

স্ট্রাকচার অফ এ কুইন মনে রাখবেন

আমি কুইন্সকে 2 এর চেয়ে তিনটি অংশ হিসাবে ভাবতে চাই :

  • পর্ব 1: অংশ 2 এবং 3 এর উপাত্ত উপস্থাপন করুন।
  • পার্ট 2: অ্যালগরিদমিকভাবে অংশ 1 পিছনে মুদ্রণ করতে ডেটা ব্যবহার করুন।
  • পার্ট 3: অংশ 2 এবং 3 মুদ্রণের জন্য উপস্থাপনাটি ডিকোড করুন।

এটি কুইন্স সম্পর্কে চিন্তা করা সহজ করে তুলতে পারে। এখানে একটি পাইথন কুইন রয়েছে, প্রতিটি লাইন একটি অংশের সাথে সম্পর্কিত:

s = "print(\"s = \" + repr(s))\nprint(s)"
print("s = " + repr(s))
print(s)

কখনও কখনও, আপনি একটি ব্যবহার eval সদৃশ অপসারণ বা অনুরূপ তবে সাধারণত আমি খুঁজে পেয়েছি যে এটি সরল কুইন লিখতে সহায়তা করে।

আসুন দুটি ভিন্ন আন্ডারলোড কুইনে একনজরে দেখে নেওয়া যাক। এটি প্রথম:

(:aSS):aSS

প্রথম অংশটি হ'ল (:aSS), যা উপাত্ত উপস্থাপন করে। দ্বিতীয়টি :aS, যা প্রিন্ট করে (:aSS)। তৃতীয় অংশটি S, যা প্রিন্ট করে:aSS

দ্বিতীয় কুইন এখানে:

(:aS(:^)S):^

প্রথমদিকে, এটি খাপ খায় না বলে মনে হয়। তবে আপনি যদি কুইনটি প্রসারিত করেন তবে আপনি পাবেন:

(:aS(:^)S):aS(:^)S

এখন (:aS(:^)S)অংশ 1, :aSঅংশ 2, এবং (:^)Sঅংশ 3।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.