উদ্ধৃতি-নিরাপদ কুইন্স


17

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

Quines জন্য স্ট্যান্ডার্ড নিয়ম প্রযোজ্য। এটি , তাই সংক্ষিপ্ততম প্রোগ্রামটি (বাইটে) জিতেছে।


8
@ATaco সৃজনশীল চিন্তা করুন। উদ্ধৃতির মধ্যে কোড স্বাভাবিকভাবে মৃত্যুদন্ড কার্যকর করা হয় না, কিন্তু যখন সমগ্র প্রোগ্রাম কোট দিয়ে বেষ্টিত ওই বিভাগে হয় মৃত্যুদন্ড কার্যকর।
পাভেল

1
হুম, গুড পয়েন্ট
এটাকো

এটি !
বিএফের

1
আপনি অবশ্যই ব্যবহার করবেন "? কিছু ভাষা দুটি বা তিনটি উদ্ধৃতি অক্ষরকে সমর্থন করে।
নীল

1
@ টেকলেহে মেটা: সঠিক কুইন হিসাবে কী গণনা করা হয়? যতদূর আমি আপনার 1-বাইট কোয়াইনটি বুঝতে পারি, এটি সর্বোচ্চ ভোট প্রাপ্ত পোস্টে প্রণীত কোড / ডেটা প্রয়োজনীয়তা লঙ্ঘন করে।
লাইকনি

উত্তর:


4

নুডেল , 9 7 বাইট

এই সংস্করণটি অন্যটির মতো একইভাবে কাজ করে, কেবলমাত্র আমি ভুলে গিয়েছিলাম যে নুডেলের একবার কোডের ব্লক চালানোর উপায় আছে এবং আমি ভাষাটি তৈরি করেছিলাম ...

Ḷ1ḥ-Ð1ḥ@€

ḷḥ-Ðḥ@ḅ

চেষ্টা করে দেখুন :)


কিভাবে এটা কাজ করে

ḷḥ-Ðḥ@ḅ # Single statement that builds itself as a string.
ḷ       # Loop the following block of code unconditionally.
 ḥ-     # Push the string literal of the token preceding this one which pushes "ḷ" onto the stack.
   Ð    # Push the stack as an array to stdout (since is an array it is done by reference).
    ḥ@  # Push the string literal for this block of code which pushes "ḥ-Ðḥ@ḅ" onto the stack.
      ḅ # Break out of the given loop. (The stack is now ["ḷ", "ḥ-Ðḥ@ḅ"]).

        # The top of the stack is popped off and displayed which modifies the array to produce {["ḷ"], "ḥ-Ðḥ@ḅ"} in stdout.

উক্তি-নিরাপত্তা

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

"ḷḥ-Ðḥ@ḅ"

"         # Pushes on the string literal "\"" onto the stack.

 ḷḥ-Ðḥ@ḅ  # Same execution as before, simply builds the Quine for this loop.
 ḷ        # Loop the following block of code unconditionally.
  ḥ-      # Push the string literal of the token preceding this one which pushes "ḷ" onto the stack.
    Ð     # Push the stack as an array to stdout (since is an array it is done by reference).
     ḥ@   # Push the string literal for this block of code which pushes "ḥ-Ðḥ@ḅ" onto the stack.
       ḅ  # Break out of the given loop. (The stack is now ["\"", "ḷ", "ḥ-Ðḥ@ḅ"]).

        " # Pushes on the string literal "\"" onto the stack.

          # The top of the stack is popped off and displayed which modifies the array to produce {["\"", "ḷ", "ḥ-Ðḥ@ḅ"], "\""} in stdout.

"চেষ্টা করুন :)"


টুকিটাকি

<div id="noodel" code='ḷḥ-Ðḥ@ḅ' input="" cols="10" rows="1"></div>
<script src="https://tkellehe.github.io/noodel/noodel-latest.js"></script>
<script src="https://tkellehe.github.io/noodel/ppcg.min.js"></script>


<div id="noodel" code='"ḷḥ-Ðḥ@ḅ"' input="" cols="10" rows="1"></div>
<script src="https://tkellehe.github.io/noodel/noodel-latest.js"></script>
<script src="https://tkellehe.github.io/noodel/ppcg.min.js"></script>


আমি eব্যবহারটি বৈধ বলে মনে করি না । বাইট 34 হিসাবে এনকোড করা চরিত্রের জন্য প্রশ্নটি জিজ্ঞাসা করে না 34, তবে ইউনিকোডের চরিত্রের 34. আপনি যে এনকোডিংটি ব্যবহার করেন তা কেবলমাত্র একটিই নয়:"
ডেনিস ২

@ ডেনিস, আমি অনুমান করছি যে আপনি যা বলছেন তা কি ইউনিকোড চরিত্রের 34 রেফারেন্সটি হ'ল সবাই নিশ্চিত যে এটি ব্যবহার করছে তা নিশ্চিত করার জন্য "? (দুঃখিত, আপনি যা বলছেন তা আমি বুঝতে পেরেছি তা নিশ্চিত করার চেষ্টা করে) এছাড়াও, আমি কি উত্তরটি উল্লেখ করে সমস্ত উত্তর মুছে ফেলা উচিত e?
tkellehe

1
হ্যাঁ, এখানে হাজার হাজার এনকোডিং রয়েছে তবে কেবল একটি ইউনিকোড অক্ষর সেট। যেহেতু "কাজ করে, আমি কেবল আলোচনাটি সরিয়ে ফেলতাম এবং কেবল ব্যবহার করব "
ডেনিস

11

পাইথন 2 3, 181 152 130 124 122 বাইট

""" """>" "or exec("oct=0");p='"""" """>" "or exec("oct=0");p=%r;a=oct==0;print(p[a:~a]%%p)#".';a=oct==0;print(p[a:~a]%p)#

এটি অনলাইন চেষ্টা করুন! টিআইও শিরোনাম এবং পাদচরণের সাথে আসে যা স্বয়ংক্রিয়ভাবে রানির বৈধতা পরীক্ষা করে। আপনি কেবল কুইন চালানোর জন্য এগুলি সাফ করতে পারেন।

এই কোডটি পাইথনে ট্রিপল-কোটেড স্ট্রিংগুলি ব্যবহার করে কাজ করে। """ """সমান ' 'এবং """" """সমান '" '

কোডটি ব্যবহার করে exec, তবে কোড হিসাবে ডেটা এক্সিকিউট করার "নন-কুইনি" পদ্ধতির জন্য নয়, কেবলমাত্র একটি এক্সপ্রেশনের ভিতরে থেকে একটি ভেরিয়েবল সেট করার জন্য। execসঠিকভাবে, অত্যধিক তথ্য এনকোড করা আছে।

প্রথম বিবৃতিটি স্ট্রিংটির সাথে সম্ভবত একটি কোট প্রিপেন্ড করা হয়েছে to " " এবং সেই octঅনুযায়ী পরিবর্তনশীল নির্ধারণ করে । (পরিবর্তনশীল কোনও সংক্ষিপ্ত অন্তর্নির্মিত হতে পারে।)

কোডের বাকী অংশগুলি পরে traditionalতিহ্যবাহী পাইথন কুইন ব্যবহার করে %r স্ট্রিং ফর্ম্যাটিং , কিছু অতিরিক্ত কোড যা octঅপরিবর্তিত থাকলে অতিরিক্ত উদ্ধৃতিগুলি ।

"প্রতারণামূলক" ব্যবহার করে একটি বিকল্প সংস্করণ execকম পুনরাবৃত্ত কোড সহ 126 বাইটে আসে:

""" """>" "and exec("oct=0");s='"""" """>" "and exec("oct=0");s=%r;p=%r;exec(p)#".';p='a=oct!=0;print(s[a:~a]%(s,p))';exec(p)#

এটি অনলাইন চেষ্টা করুন!


7

স্ট্যান্ডার্ড এমএমএল , 182 176 108 বাইট

";str(chr 34)^it;(print(it^it);fn x=>print(x^it^x^it))";str(chr 34)^it;(print(it^it);fn x=>print(x^it^x^it))

উদ্ধৃত সংস্করণ: কোডিংগ্রাউন্ডে এটি ব্যবহার করে দেখুন।
উদ্ধৃত সংস্করণ: কোডিংগ্রাউন্ডে এটি ব্যবহার করে দেখুন।

দ্রষ্টব্য যে আউটপুটটি এরকম কিছু দেখাচ্ছে

> val it = "{some string}" : string
> val it = "{some string}" : string
{output to stdout}> val it = fn : string -> unit

কারণ কোডটি ঘোষণাপত্রের মাধ্যমে ঘোষণাপত্রটি ব্যাখ্যা করা হয় (প্রতিটি ;একটি ঘোষণার সমাপ্ত হয়) এবং প্রতিটি ঘোষণার মান এবং প্রকার দেখায়।


পটভূমি

এসএমএলে ফর্মের একটি রাইন রয়েছে <code>"<code in quotes>":

str(chr 34);(fn x=>print(x^it^x^it))"str(chr 34);(fn x=>print(x^it^x^it))" 

এবং ফর্ম একটি "<code in quotes>"<code>:

";str(chr 34)^it;print(it^it)";str(chr 34)^it;print(it^it)

উভয়ই এই সত্যের উপর নির্ভর করে যে- <code>পার্টটিতে কোনও উদ্ধৃতি নেই এবং তাই কোনও কিছুর পালানোর প্রয়োজনের সাথে উদ্ধৃতি "দেওয়া যেতে পারে, কোয়েনটিকে আউটপুট দেওয়ার প্রয়োজনীয়তা দ্বারা সরবরাহ করা হয়str(chr 34)

itকোনও বিবৃতিতে যখন কোনও স্পষ্টত শনাক্তকারী দেওয়া না হয় তখন এগুলি অন্তর্নিহিত শনাক্তকারীকে খুব ভারী নির্ভর করে ।

প্রথম quine সালে str(chr 34);বেঁধে itধারণকারী স্ট্রিং ", fn x=>শুরু হয় একটি বেনামী ফাংশন একটি আর্গুমেন্ট গ্রহণ xযোগসূত্র তারপর, x^it^x^itএবং তার ফলে স্ট্রিং ছাপে। এই বেনামে ফাংশনটি সরাসরি প্রোগ্রাম কোডযুক্ত একটি স্ট্রিংয়ে প্রয়োগ করা হয়, সুতরাং উপসংহার x^it^x^itফলন হয় <code>"<code>"

দ্বিতীয় কুইনটি কেবল প্রোগ্রাম কোড দিয়ে স্ট্রিং হিসাবে শুরু হয় ";str(chr 34)^it;print(it^it)";যা আবদ্ধ it। তারপরে str(chr 34)^it;স্ট্রিংয়ের শুরুতে একটি উদ্ধৃতিটি উপস্থাপন করে এবং পুনরায় কোনও স্পষ্টত শনাক্তকারী দেওয়া হয় না, ফলস্বরূপ স্ট্রিংটি "<code>আবদ্ধ it। পরিশেষে print(it^it)স্ট্রিংটি নিজেই ফলন দেয় "<code>"<code>যা পরে মুদ্রিত হয় conc


ব্যাখ্যা

সম্পাদনা করুন: 108-বাইট সংস্করণটি আর আপ টু ডেট নেই, তবে এই ব্যাখ্যাটি পড়ার পরে কেউ এটিকে বুঝতে পারে।

উদ্ধৃতি-সুরক্ষিত কুইন উপরের উভয় পদ্ধতির সাথে একত্রিত হয় এবং এটিই ফর্মের "<code>"<code>। এটিকে আবার উদ্ধৃতি ""<code>"<code>"প্রদানের ফলন হিসাবে দেওয়া , সুতরাং আমরা একটি খালি স্ট্রিং এবং তারপরে অন্য ফর্মের একটি কুইন পাই।

তার মানে প্রোগ্রামটি হয় হয় "<code>শনাক্তকারী দ্বারা ফর্মটিতে তার নিজস্ব উত্স দেওয়া হয় it, বা itন্যায়সঙ্গত "এবং আমাদের <code>যুক্তি হিসাবে আমাদের নিজস্ব উত্স দেওয়া হয় এবং এইভাবে এই জাতীয় যুক্তি পরিচালনা করে এমন একটি ফাংশন হতে হবে।

(if size it>1then(print(it^it);fn _=>())else fn x=>print(it^it^x^it^x^it))

আমরা কোন ক্ষেত্রে রয়েছি তা সনাক্ত করতে, আমরা যাচাই করি যা আকারের আকার 1 এর itচেয়ে বড় কিনা তা যদি না itহয় "এবং আমরা দ্বিতীয় ক্ষেত্রে থাকি, সুতরাং elseপার্টটি একটি বেনাম ফাংশন দেয় fn x=>print(it^it^x^it^x^it)যা পরে বলা হয় কারণ এটি উত্সটি স্ট্রিং হিসাবে অনুসরণ করে । it^it^প্রোগ্রামটির শুরুতে খালি স্ট্রিংয়ের জন্য প্রয়োজনীয় নেতৃস্থানীয়টি নোট করুন ।

যদি size it1 এর চেয়ে বড় হয় আমরা- thenপার্টে থাকি এবং ঠিক পারফর্ম করি print(it^it), তাই না? পুরোপুরি নয়, কারণ আমি আপনাকে অবহেলা করেছি যে এসএমএল দৃ strongly়ভাবে টাইপ করা হয়েছে যার অর্থ একটি শর্তসাপেক্ষে if <cond> then <exp_1> else <exp_2>সবসময় একই ধরণের থাকতে হবে যার অর্থ আবারও বোঝা যায় <exp_1>এবং <exp_2>একই ধরণের হওয়া দরকার। আমরা ইতিমধ্যে elseঅংশটির প্রকারটি জানি : একটি বেনামে ফাংশন যা একটি স্ট্রিং নেয় এবং তারপরে কলগুলি printটাইপ করে string -> <return type of print>এবং printটাইপ থাকে string -> unit( unitঅন্য উপায়ে একইভাবে হয় void), ফলে ফলাফলটি আবার হয় string -> unit

তাই আপনি যদি thenঅংশ ছিল মাত্র print(it^it)কোন ধরনের হয়েছে unit, আমরা একটি টাইপ মেলেনি ত্রুটি পেতে হবে। তাহলে কেমন fn _=>print(it^it)? ( _ব্যবহৃত হয় না এমন একটি আর্গুমেন্টের জন্য ওয়াইল্ডকার্ড) নিজস্ব বেনামে এই ফাংশনটিতে টাইপ রয়েছে 'a -> unitযেখানে 'aএকটি স্বেচ্ছাচারিতা টাইপ থাকে তাই আমাদের শর্তসাপেক্ষিক প্রেক্ষাপটে যা কোনও string -> unitপ্রকার প্রয়োগ করে এটি কাজ করবে। (প্রকারের সাথে ভেরিয়েবলটি 'aতাত্ক্ষণিকভাবে প্রবর্তিত stringহয় this) তবে, এই ক্ষেত্রে আমরা কোনও কিছুই প্রিন্ট করব না কারণ নামহীন ফাংশনটি কখনই বলা হয় না! মনে রাখবেন, আমরা যখন- thenপার্টে যাই তখন সামগ্রিক কোড হয় "<code>"<code>, সুতরাং- <code>পার্ট কোনও ফাংশনকে মূল্যায়ন করে তবে এর পরে কিছুই আসে না, এটি কল হয় না।

এর পরিবর্তে আমরা একটি sequentialisation যা ফর্ম আছে ব্যবহার (<exp_1>; ...; <exp_n>)যেখানে <exp_1>থেকে <exp_n-1>নির্বিচারে ধরনের এবং প্রকার থাকা পারে <exp_n>পুরো sequentialisation ধরণ প্রদান করে। দেখুন মূল্যবোধের কার্মিক বিন্দু থেকে <exp_1>থেকে <exp_n-1>কেবল বাতিল করা হয়, তবে SML এছাড়াও অনুজ্ঞাসূচক নির্মান সমর্থন করে, যাতে এক্সপ্রেশন পার্শ্ব প্রতিক্রিয়া হতে পারে। সংক্ষেপে, আমরা পার্ট (print(it^it);print)হিসাবে গ্রহণ করি then, এইভাবে প্রথমে মুদ্রণ এবং তারপরে printসঠিক টাইপযুক্ত ফাংশনটি ফিরিয়ে আনব ।


7

ভি , 27 , 23 বাইট

éPñi"éP241"qpá"lxx|xÿ

এটি অনলাইন চেষ্টা করুন!

যেহেতু এটিতে কিছু ছাপানো অক্ষর নেই তাই এখানে একটি পাঠযোগ্য সংস্করণ:

éPñi"éP<C-v>241<esc>"qpá"lxx|xÿ

এবং এখানে একটি হেক্সডাম্প:

00000000: e950 f169 22e9 5016 3234 311b 2271 70e1  .P.i".P.241."qp.
00000010: 226c 7878 7c78 ff                        "lxx|x.

সুতরাং আমাদের প্রথম যে জিনিসটি করা দরকার তা হ'ল প্রথম চরিত্রটি একটি উদ্ধৃতি কিনা তা নির্ধারণ করা। éPএকটি 'পি' অক্ষর সন্নিবেশ "éPকরানো হয় , তবে এটি একটি নিওপ। এর পরে, আমরা স্ট্যান্ডার্ড এক্সটেন্ডেবল কুইনে কিছুটা পরিবর্তন চালাই যা হ'ল:

ñi<C-v>241<esc>"qpÿ

আমরা যদিও এটি কিছুটা ভিন্নভাবে করতে যাচ্ছি। প্রথমে আমাদের প্রারম্ভিক "éP" পাঠ্য সন্নিবেশ করা দরকার। সুতরাং আমরা কি

ñ                        " Start recording into register 'q'
 i                       " Enter insert mode
  "éP<C-v>241<esc>       " Enter the following text: '"éPñ'
                  "qp    " Paste the text in register 'q'
                     á"  " Append a '"'

এখানেই ব্রাঞ্চিং ঘটে। বাফারে বর্তমানে পাঠ্যটি হ'ল

"éPñi"éP<C-v>241<esc>"qpá"P
Cursor is here ----------^

যদি না আমরা এটিকে উদ্ধৃতিগুলিতে আবৃত করি, সে ক্ষেত্রে 'পি' কখনই প্রবেশ করানো যেত না এবং বাফারটি হ'ল:

"éPñi"éP<C-v>241<esc>"qpá"
Cursor is here ----------^

যেহেতু আমরা এখনও রেকর্ডিং করছি, আমরা এখানে যা কিছু করতে চাই তা করতে পারি এবং যখন এটি "qpঘটে তখন এটি বাফারে যুক্ত হবে। সুতরাং এখান থেকে শর্তসাপেক্ষে উদ্ধৃতিগুলি মুছে ফেলা বেশ সহজ:

l           " Move one character to the right. If there is no character to the right, 
            " then this is effectively a "break" statement, stopping playback of the recording
 xx         " Delete two characters (the '"P')
   |        " Move to the first character on this line
    x       " Delete one character
     ÿ      " End the program

3

জাভাস্ক্রিপ্ট (ES6), 239 237 বাইট

Set=``;eval(";a='Set=``;eval(~;a=1;S=String.fromCharCode;q=S(34);r=Set&&q;s=S(39);alert(r+a.replace(/[^ -}]/g,q).replace(1,s+a+s)+r);~)';S=String.fromCharCode;q=S(34);r=Set&&q;s=S(39);alert(r+a.replace(/[^ -}]/g,q).replace(1,s+a+s)+r);")

নতুন সংস্করণে প্রতিটি সংস্করণ চেষ্টা করার জন্য যত্ন নিন (যেমন, একটি নতুন ব্রাউজার ট্যাব)

এটি সরল করার জন্য কমপক্ষে একটি উপায় থাকতে হবে ...


1
আমি মনে করি আপনি এর মতো প্রতিস্থাপনগুলির জন্য একটি অ্যারে ব্যবহার করতে পারেন: [x = "প্রতিস্থাপন"]। যদিও বিরতিযুক্ত জিনিসগুলি, আমি কুইনসের সাথে খুব বেশি অভিজ্ঞ নই ...
লুক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.