পার্ল, 1116 1124 বাইট, এন = 3, স্কোর = 1124 ^ (2/3) বা প্রায় 108.1
আপডেট : আমি এখন যাচাই করেছি যে এটি ব্রুট ফোর্সের মাধ্যমে n = 3 নিয়ে কাজ করে (যা কয়েক দিন সময় নিয়েছে); এই কমপ্লেক্সের একটি প্রোগ্রাম সহ, হাত দ্বারা বিকিরণ-প্রতিরোধের জন্য পরীক্ষা করা শক্ত (এবং আমি পূর্ববর্তী সংস্করণে একটি ভুল করেছি, যার কারণেই বাইট গণনা বৃদ্ধি পেয়েছে)। শেষ আপডেট
আমি স্টাডারকে কোথাও পুনঃনির্দেশ করার পরামর্শ দিচ্ছি যা আপনি এটি দেখতে পাবেন না; আপনি যদি এর থেকে অক্ষর মুছছেন না তখনও এই প্রোগ্রামটি সন্দেহজনক সিনট্যাক্স সম্পর্কে এক ধরণের সতর্কতা তৈরি করে।
এটি সম্ভব যে প্রোগ্রামটি ছোট করা যায়। এটিতে কাজ করা মোটামুটি বেদনাদায়ক, এটি সম্ভব মাইক্রো-অপ্টিমাইজেশানকে মিস করা সহজ করে তোলে। আমি বেশিরভাগ ক্ষেত্রে ডিলেটযোগ্য অক্ষরের সংখ্যা যতটা সম্ভব উচ্চের দিকে লক্ষ্য করছিলাম (কারণ এটি প্রোগ্রামের সত্যই চ্যালেঞ্জিং অংশ), এবং কোড-গল্ফ টাইব্রেককে এমন কিছু হিসাবে বিবেচনা করেছিলেন যা লক্ষ্য করা ভাল তবে কিছু না যা আমি রাখি না অনুকূলকরণে হাস্যকর প্রচেষ্টা (দুর্ঘটনার দ্বারা বিকিরণ প্রতিরোধের খুব সহজেই ভাঙ্গা এই ভিত্তিতে)।
কার্যক্রম
দ্রষ্টব্য: _
চারটি ঘটনার প্রতিটিের আগেই একটি আক্ষরিক নিয়ন্ত্রণ- অক্ষর (ASCII 31) রয়েছে -+
। আমি মনে করি না এটি স্ট্যাকওভারফ্লোতে সঠিকভাবে অনুলিপি করে আটকানো হয়েছে, সুতরাং প্রোগ্রামটি চালানোর আগে আপনাকে এটি পুনরায় যুক্ত করতে হবে।
eval+<eval+<eval+<eval+(q(FoPqOlengthFoBBPP181XXVVVVJJJKKKNdoWchopJFtPDevalMODx4KNFrPIPA-MN-TUV-ZPINFsPIFoPqOI.Fo.IQNevalFoINevalIFsPZyI.Fr.IT-UPINsayDFtJqJFsKPZyPT-UFWrYrKD.DEEEEQDx6NsayDNDforB1..4YforB1..4NexitQNevalFo)=~y=A-Z=-+;-AZz-~=r)####>####>####>####>####>####>
;
;
;
;
eval+<eval+<eval+<eval+(q(FoPqOlengthFoBBPP181XXVVVVJJJKKKNdoWchopJFtPDevalMODx4KNFrPIPA-MN-TUV-ZPINFsPIFoPqOI.Fo.IQNevalFoINevalIFsPZyI.Fr.IT-UPINsayDFtJqJFsKPZyPT-UFWrYrKD.DEEEEQDx6NsayDNDforB1..4YforB1..4NexitQNevalFo)=~y=A-Z=-+;-AZz-~=r)####>####>####>####>####>####>
;
;
;
;
eval+<eval+<eval+<eval+(q(FoPqOlengthFoBBPP181XXVVVVJJJKKKNdoWchopJFtPDevalMODx4KNFrPIPA-MN-TUV-ZPINFsPIFoPqOI.Fo.IQNevalFoINevalIFsPZyI.Fr.IT-UPINsayDFtJqJFsKPZyPT-UFWrYrKD.DEEEEQDx6NsayDNDforB1..4YforB1..4NexitQNevalFo)=~y=A-Z=-+;-AZz-~=r)####>####>####>####>####>####>
;
;
;
;
eval+<eval+<eval+<eval+(q(FoPqOlengthFoBBPP181XXVVVVJJJKKKNdoWchopJFtPDevalMODx4KNFrPIPA-MN-TUV-ZPINFsPIFoPqOI.Fo.IQNevalFoINevalIFsPZyI.Fr.IT-UPINsayDFtJqJFsKPZyPT-UFWrYrKD.DEEEEQDx6NsayDNDforB1..4YforB1..4NexitQNevalFo)=~y=A-Z=-+;-AZz-~=r)####>####>####>####>####>####>
;
;
;
;
ব্যাখ্যা
এই প্রোগ্রামটি বেশ স্পষ্টতই চারটি অভিন্ন ছোট ছোট প্রোগ্রামের সাথে একত্রে তৈরি। মূল ধারণাটি হ'ল প্রোগ্রামটির প্রতিটি অনুলিপি এটি যাচাই করতে খুব খারাপ ক্ষতি হয়েছে কিনা তা যাচাই করবে; যদি এটি হয়ে থাকে তবে এটি কিছুই করতে পারে না (সম্ভবত স্প্রে সতর্কতা ব্যতীত) এবং পরবর্তী কপিটি চালাতে দেয়; যদি এটি না হয়ে থাকে (যেমন কোনও মুছে ফেলা হয়নি, বা মুছে ফেলা চরিত্রটি এমন ছিল যা প্রোগ্রামটির ক্রিয়াকলাপে কোনও পার্থক্য রাখে না), তবে এটি তার ক্ষুদ্রতম কাজটি করবে (পুরো প্রোগ্রামটির উত্স কোডটি মুদ্রণ করে; এটি একটি যথাযথ কুইন, প্রতিটি উত্সের কোডের এনকোডিংযুক্ত প্রতিটি অংশ সহ) এবং তারপরে প্রস্থান করুন (উত্স কোডটি আবার মুদ্রণ করা থেকে অন্য কোনও অবিচলিত অনুলিপি আটকাতে এবং এভাবে খুব বেশি পাঠ্য মুদ্রণ করে কোয়াইনকে নষ্ট করে) exit
প্রতিটি অংশটি দুটি অংশের পরিবর্তে কার্যকরভাবে কার্যকরভাবে কার্যকরভাবে পৃথক; একটি বাইরের মোড়ক এবং কিছু অভ্যন্তরীণ কোড। যেমন, আমরা তাদের আলাদাভাবে বিবেচনা করতে পারি।
বাইরের মোড়ক
বাইরের র্যাপারটি মূলতঃ eval<+eval<+eval< ... >####>####...>###
(আরও কিছু সেমিকোলন এবং নিউলাইনগুলির একটি গুচ্ছ যার উদ্দেশ্যটি সুস্পষ্ট হওয়া উচিত; এটি নিশ্চিত করার জন্য যে কিছু সেমিকোলন বা তাদের আগে নতুন লাইনগুলি মুছে ফেলা না হলে প্রোগ্রামের অংশগুলি পৃথক থাকবে) )। এটি মোটামুটি সহজ দেখাচ্ছে, তবে এটি বেশ কয়েকটি উপায়ে সূক্ষ্ম এবং যে কারণে আমি এই চ্যালেঞ্জটির জন্য পার্লকে বেছে নিয়েছি।
প্রথমে, আসুন দেখে নেওয়া যাক কীভাবে প্রোগ্রামটির একটি অনাদায়ী কপিতে মোড়ক কাজ করে। eval
অন্তর্নির্মিত ফাংশন হিসাবে পার্স, যা একটি যুক্তি লাগে। যেহেতু একটি যুক্তি প্রত্যাশিত, +
এখানে একটি অকার্যকর +
(যা এখনই পার্ল গল্ফারদের কাছে খুব পরিচিত হবে; তারা আশ্চর্যজনকভাবে প্রায়শই দরকারী হয়ে আসে)। আমরা এখনও একটি যুক্তি প্রত্যাশা করছি (আমরা কেবল একটি অযৌক্তিক অপারেটরকে দেখেছি), সুতরাং <
পরবর্তীটি <>
অপারেটরের সূচনা হিসাবে ব্যাখ্যা করা হয় (যা কোনও উপসর্গ বা পোস্টফিক্স আর্গুমেন্ট নেয় না, এবং এভাবে অপারেন্ড অবস্থানে ব্যবহার করা যেতে পারে)।
<>
মোটামুটি অদ্ভুত অপারেটর। তার স্বাভাবিক উদ্দেশ্য filehandles পড়তে, এবং আপনি filehandle নাম লিখুন ভিতরে কোণ বন্ধনী। বিকল্পভাবে, যদি ফাইলহ্যান্ডেলের নাম হিসাবে অভিব্যক্তিটি বৈধ না হয় তবে এটি গ্লোব্বিং করে (মূলত, ইউনিক্স শেলগুলি ব্যবহারকারী দ্বারা কমান্ড-লাইন আর্গুমেন্টের ক্রম হিসাবে প্রবেশ করা পাঠ্য অনুবাদ করতে ব্যবহার করে; একই সাথে পার্লের অনেক পুরানো সংস্করণ ব্যবহৃত হয় এটির জন্য শেল, তবে আজকাল পার্ল অভ্যন্তরীণভাবে গ্লোব্বিং পরিচালনা করে)। উদ্দিষ্ট ব্যবহার, সুতরাং, এর লাইনে বরাবর <*.c>
, যা সাধারণত একটি তালিকা ফিরে আসে ("foo.c", "bar.c")
। একটি স্কেলার প্রসঙ্গে (যেমন যুক্তি হিসাবেeval
), এটি সবেমাত্র প্রথম এন্ট্রিটি দেখায় এটি প্রথমবারের মতো এটি চালিত হয় (প্রথম যুক্তির সমতুল্য), এবং অনুমানীয় ভবিষ্যতের রানগুলির ক্ষেত্রে অন্যান্য এন্ট্রিগুলি ফিরিয়ে দেয় যা কখনই ঘটে না।
এখন, শেলগুলি প্রায়শই কমান্ড-লাইন আর্গুমেন্টগুলি পরিচালনা করে; যদি আপনি -r
কোনও যুক্তি ছাড়াই এর মতো কিছু দেন , তবে সেই নামটি সহ কোনও ফাইল আছে কিনা তা নির্বিশেষে এটি প্রোগ্রাম ভারব্যাটিমের কাছে পৌঁছে দেওয়া হবে। পার্ল একইভাবে কাজ করে, তাই যতক্ষণ না আমরা নিশ্চিত করি যে শেল বা পারেলের সাথে বিশেষ <
এবং মিলের মধ্যে কোনও বিশেষ অক্ষর নেই >
, আমরা কার্যকরভাবে স্ট্রিং আক্ষরিকের একটি বিশ্রী রূপের মতো এটি ব্যবহার করতে পারি। আরও ভাল, কোটের মতো অপারেটরদের জন্য পার্লের পার্সারের এমন বন্ধুত্বগুলি এমনকি এটির মতো প্রসঙ্গে যেখানে বন্ধুর সাথে মেলে এমন কোনও বাধ্যতামূলক প্রবণতা রয়েছে যেখানে এটি কোনও বোধগম্য নয়, তাই আমরা <>
নিরাপদে বাসা বেঁধে ফেলতে পারি (যা এই প্রোগ্রামটি সম্ভব হওয়ার জন্য প্রয়োজনীয় আবিষ্কার)। এই সমস্ত নেস্টেড এর প্রধান খারাপ দিক <>
হ'ল এর বিষয়বস্তু থেকে দূরে থাকা<>
প্রায় অসম্ভব; প্রত্যেকটির সাথে অনস্কেপিংয়ের দুটি স্তর রয়েছে বলে মনে হয় <>
, তাই তিনটির অভ্যন্তরে কিছু এড়ানোর জন্য এটির আগে 63৩ টি ব্যাকস্ল্যাশ চালানো দরকার। আমি স্থির করেছিলাম যে যদিও কোড আকারটি এই সমস্যায় কেবলমাত্র দ্বিতীয় বিবেচ্য বিষয়, তবে এটি অবশ্যই আমার স্কোরের জন্য এই ধরণের পেনাল্টি প্রদানের পক্ষে উপযুক্ত নয়, তাই আমি কেবল আক্রমণাত্মক চরিত্রগুলি ব্যবহার না করেই বাকি প্রোগ্রামটি লেখার সিদ্ধান্ত নিয়েছি।
তাহলে মোড়কের অংশগুলি মুছলে কী ঘটে?
- শব্দটির বিলোপগুলির
eval
ফলে এটি একটি খালি শব্দে রূপান্তরিত হয়, একটি অর্থহীন স্ট্রিং। পার্ল এগুলি পছন্দ করে না তবে এটি তাদের সাথে এমন আচরণ করে যেন তারা চারদিকে কোট দিয়ে ঘেরা থাকে; এইভাবে eal<+eval<+...
ব্যাখ্যা করা হয়"eal" < +eval<+...
। এটি প্রোগ্রামের অপারেশনে কোনও প্রভাব ফেলবে না, কারণ এটি মূলত ভারী নেস্টেড ইওলস (যা আমরা যাইহোক ব্যবহার করি না) থেকে ফলাফল গ্রহণ করে এটি একটি পূর্ণসংখ্যার কাছে কাস্ট করে, এবং এর উপর কিছু অর্থহীন তুলনা করে। (এই ধরণের জিনিসটি প্রচুর সতর্কতার স্প্যামের কারণ হিসাবে দেখা দেয় যে এটি সাধারণ পরিস্থিতিতে করা স্পষ্টত কোনও কার্যকর জিনিস নয়; আমরা কেবল এটি মুছে ফেলতে শোষণ করতে ব্যবহার করছি)) এটি আমাদের প্রয়োজনীয় বন্ধনী বন্ধনীগুলির সংখ্যা পরিবর্তন করে (কারণ উদ্বোধনী বন্ধনী পরিবর্তে এখন তুলনা অপারেটর হিসাবে ব্যাখ্যা করা হচ্ছে), তবে শেষে মন্তব্যগুলির শৃঙ্খলাটি নিশ্চিত করে যে স্ট্রিংটি যতবার বাসা বেঁধেছে না কেন নিরাপদে শেষ হবে। (এখানে #
কঠোরভাবে প্রয়োজনের চেয়ে আরও বেশি লক্ষণ রয়েছে; প্রোগ্রামটি আরও সংকোচযোগ্য করার জন্য আমি এটি লিখেছিলাম, যাতে কুইন সংরক্ষণের জন্য আমাকে কম ডেটা ব্যবহার না করে))
- যদি কোনও
<
মুছে ফেলা হয়, কোডটি এখন এটিকে পার্স করে eval(eval<...>)
। মাধ্যমিকটির বাইরের eval
কোনও প্রভাব নেই, কারণ আমরা যে প্রোগ্রামগুলি পর্যালোচনা করছি সেগুলি প্রোগ্রাম হিসাবে কোনও বাস্তব প্রভাব রয়েছে এমন কিছু ফেরত দেয় না (যদি তারা সাধারণভাবে ফিরে আসে তবে এটি সাধারণত নাল স্ট্রিং বা একটি খালি শব্দ; আরও সাধারণত তারা ফেরত দিয়ে ফিরে আসে) ব্যতিক্রম, যার ফলে eval
নাল স্ট্রিং exit
ফেরত আসে বা কিছুটা ফিরে এড়াতে ব্যবহার করা হয়)।
- যদি
+
কোনওটি মুছে ফেলা হয়, সংলগ্ন কোড অক্ষত থাকলে এর কোনও তাত্ক্ষণিক প্রভাব নেই; unary +
প্রোগ্রামে কোন প্রভাব আছে। (মূলগুলি +
হ'ল ক্ষতিগুলি মেরামত করতে সহায়তা করার জন্য; তারা রিলেশনাল অপারেটর হিসাবে পরিবর্তে <
অ্যানারি হিসাবে ব্যাখ্যা করা পরিস্থিতিতে এমন সংখ্যা বৃদ্ধি করে যার <>
অর্থ আপনার একটি অবৈধ প্রোগ্রাম তৈরি করতে আরও মুছে ফেলা প্রয়োজন))
পর্যাপ্ত মোছার সাথে মোড়কের ক্ষতি হতে পারে তবে এমন কিছু তৈরি করতে পারে যা বিশ্লেষণ করে না। চারটি মোছার সাথে, আপনি এটি করতে পারেন:
eal<evl<eval+<...
এবং পার্লে, সম্পর্কিত অপারেটর <
ননসোসিয়েটিভ, এবং এইভাবে আপনি একটি সিনট্যাক্স ত্রুটি পান (একই সাথে আপনি যা করতে চান 1<2<3
) get সেই হিসাবে, লিখিত হিসাবে প্রোগ্রামটির ক্যাপটি হ'ল এন = 3। আরও অবিচ্ছিন্ন +
এস যুক্ত করা এটি বাড়ানোর একটি প্রতিশ্রুতিবদ্ধ উপায় বলে মনে হচ্ছে, তবে এটি ক্রমবর্ধমানভাবে তৈরি করতে চাইবে যে মোড়কের অভ্যন্তরটি খুব ভেঙে যেতে পারে, যা যাচাই করে প্রোগ্রামটির নতুন সংস্করণটি খুব কঠিন হতে পারে।
মোড়কটি এত মূল্যবান হওয়ার কারণটি হ'ল eval
পার্লের ব্যতিক্রমগুলি ধরেন, যেমন (উদাহরণস্বরূপ) আপনি একটি বাক্য গঠন ত্রুটি সংকলনের চেষ্টা করার পরে যে ব্যতিক্রমটি পান। যেহেতু এটি eval
একটি স্ট্রিং আক্ষরিক, স্ট্রিংয়ের সংকলন রানটাইমের সময় ঘটে এবং আক্ষরিক সংকলন করতে ব্যর্থ হলে ফলাফল ব্যতিক্রম ধরা পড়ে। এর ফলে eval
নাল স্ট্রিং ফিরে আসে এবং ত্রুটি সূচকটি সেট হয়ে যায় $@
, তবে আমরা কখনই পরীক্ষা করি না (প্রোগ্রামটির কয়েকটি রূপান্তরিত সংস্করণে মাঝে মধ্যে ফিরে আসা নাল স্ট্রিংটি সম্পাদন করে)। গুরুতরভাবে, এর অর্থ হ'ল যদি ভিতরের কোডটিতে কিছু ঘটেমোড়ক, সিনট্যাক্স ত্রুটির কারণ হয়ে যায়, তারপরে মোড়কটি কোডটির পরিবর্তে কোডটি কিছুই না করে (এবং প্রোগ্রামটি নিজেই একটি অনাদায়ী কপিটি সন্ধানের প্রয়াসে চালিয়ে যাবে)। অতএব, অভ্যন্তরীণ কোডটি মোড়কের মতো তেজস্ক্রিয়তা-প্রমাণের মতো হতে হবে না; আমরা যা যত্ন নিই তা হ'ল ক্ষতিগ্রস্থ হলে এটি প্রোগ্রামের ননডামাজড সংস্করণটির সাথে একইভাবে কাজ করবে, নাহলে এটি ক্র্যাশ হয়ে যাবে ( eval
ব্যতিক্রমটি ধরতে এবং চালিয়ে যাওয়ার অনুমতি দেয় ) বা কোনও কিছুই প্রিন্ট না করেই স্বাভাবিকভাবে প্রস্থান করবে।
মোড়কের ভিতরে
মোড়কের অভ্যন্তরের কোডটি মূলতঃ এর মতো দেখাচ্ছে (আবারও একটি নিয়ন্ত্রণ রয়েছে _
that স্ট্যাক এক্সচেঞ্জটি এর আগে অবিলম্বে প্রদর্শিত হবে না -+
):
eval+(q(...)=~y=A-Z=-+;-AZz-~=r)
এই কোডটি পুরোপুরি গ্লোব-নিরাপদ অক্ষরের সাথে রচিত এবং এর উদ্দেশ্য হ'ল বিরাম চিহ্নগুলির একটি নতুন বর্ণমালা যুক্ত করা যা একটি স্ট্রিং আক্ষরিককে প্রতিলিপি এবং মূল্যায়নের মাধ্যমে একটি আসল প্রোগ্রাম লিখতে সম্ভব করে তোলে (আমরা ব্যবহার করতে পারি না '
বা "
আমাদের উদ্ধৃতি হিসাবে) চিহ্নগুলি, তবে q(
… )
পার্লের স্ট্রিং গঠনের একটি বৈধ উপায়) (অপ্রকাশনীয় চরিত্রের কারণ হ'ল প্রোগ্রামে আক্ষরিক স্থানের অক্ষর ছাড়াই আমাদের মহাকাশ চরিত্রের কোনও কিছু লিখিতভাবে লিপিবদ্ধ করতে হবে; সুতরাং আমরা ASCII 31 থেকে শুরু করে একটি পরিসীমা গঠন করি এবং স্থানটিকে দ্বিতীয় শ্রেণীর উপাদান হিসাবে ধরা করি।) স্পষ্টতই, আমরা যদি লিখিত লিখনের মাধ্যমে কিছু অক্ষর তৈরি করি তবে এগুলি থেকে প্রতিবর্ণীকরণের জন্য আমাদের অক্ষর ত্যাগ করতে হবে, তবে বড় হাতের অক্ষর খুব কার্যকর নয় এবং বিরাম চিহ্নগুলিতে অ্যাক্সেস না করে অ্যাক্সেস ছাড়াই লিখতে অনেক সহজ।
এখানে বিরাম চিহ্নগুলির বর্ণমালা রয়েছে যা গ্লোবের ফলাফল হিসাবে উপলব্ধ হয় (উপরের রেখাটি এনকোডিংটি দেখায়, নিম্নরেখায় এটি অক্ষরটি অক্ষরযুক্ত করে):
BCDEFGHIJKLMNOPQRSTUVWXYZ
! "# $% & '() * + +; <=> @ Azz {|} ~
সর্বাধিক উল্লেখযোগ্যভাবে, আমাদের কাছে এমন কিছু বিরাম চিহ্ন রয়েছে যা গ্লোব-সেফ নয় তবে স্পেস ক্যারেক্টারের সাথে পার্ল প্রোগ্রাম লেখার ক্ষেত্রে কার্যকর। আমি দুটি বড় হাতের অক্ষরও সংরক্ষণ করেছি, আক্ষরিক A
এবং Z
(যা তাদের কাছে এনকোড করে না, তবে T
এবং কেন U
, কারণ A
উপরের পাশাপাশি নিম্ন সীমার শেষ পয়েন্ট হিসাবে প্রয়োজন ছিল); এটি আমাদেরকে নতুন এনকোডযুক্ত অক্ষর সেট ব্যবহার করে লিখিত লিখনের নির্দেশ নিজেই লেখার অনুমতি দেয় (যদিও বড় হাতের অক্ষরগুলি তেমন কার্যকর না হয় তবে এগুলি বড় হাতের অক্ষরে পরিবর্তনগুলি নির্দিষ্ট করতে কার্যকর হয়)। সবচেয়ে উল্লেখযোগ্য কিছু অক্ষর আছে যা আমরা আছে না [
, \
এবং ]
, কিন্তু তেমন কাউকে প্রয়োজন হয় (যখন আমি আউটপুটে একটি newline প্রয়োজন, আমি তা থেকে অন্তর্নিহিত সম্পর্কে newline ব্যবহার করে উত্পাদিতsay
লেখার প্রয়োজনের চেয়ে \n
; chr 10
এছাড়াও কাজ করেছে তবে আরও ভার্জোজ)।
যথারীতি, র্যাটারের অভ্যন্তরে স্ট্রিংয়ের বাইরে ক্ষতিকারক হয়ে পড়লে কী হয় তা নিয়ে আমাদের চিন্তিত হওয়া উচিত। একটি দূষিত eval
কিছু চলমান প্রতিরোধ করবে; আমরা এটা ঠিক আছে। যদি উদ্ধৃতি চিহ্নগুলি ক্ষতিগ্রস্থ হয়, তবে স্ট্রিংটির অভ্যন্তরটি পার্ল বৈধ নয়, এবং এভাবে মোড়কটি এটি ধরবে (এবং স্ট্রিংগুলিতে অসংখ্য বিয়োগফলের অর্থ এই যে আপনি এটি কার্যকর বৈধ পার্ল করতে পারলেও এটি কিছুই করবে না, যা এটি একটি গ্রহণযোগ্য ফলাফল)। প্রতিবর্ণের ক্ষয়ক্ষতি, যদি এটি একটি সিনট্যাক্স ত্রুটি না হয় তবে স্ট্রিংকে মূল্যায়ন করা হবে যা সাধারণত এটি একটি সিনট্যাক্স ত্রুটিতে পরিণত হয়; আমি 100% নিশ্চিত নই যে এটির কোনও ঘটনা ঘটেনি, তবে আমি এই মুহুর্তে এটি নিশ্চিত করার জন্য নিষ্ঠুর-জোর করে করছি, যদি আছে তবে এটি ঠিক করার পক্ষে যথেষ্ট সহজ হওয়া উচিত।
এনকোডেড প্রোগ্রাম
স্ট্রিং আক্ষরিক ভিতরে খুঁজছি, এনকোডিং আমি ব্যবহার করত এবং যোগ হোয়াইটস্পেস reversing এটি আরো পাঠযোগ্য করতে, আমরা এই (আবার, আগে একটি কন্ট্রোল- আন্ডারস্কোর কল্পনা পেতে -+
যা এনকোড করা হয়, A
):
$o=q<
length$o ==181 || zzzz((()));
do {
chop ($t = "eval+<"x4);
$r = '=-+;-AZz-~=';
$s = '$o=q<' . $o . '>;eval$o';
eval '$s=~y' . $r . 'A-Z=';
say "$t(q($s)=~y=A-Z${r}r)" . "####>"x6;
say ";" for 1..4
} for 1..4;
exit>;
eval $o
লোকেরা যারা কুইনে অভ্যস্ত তারা এই সাধারণ কাঠামোটি চিনবে। সর্বাধিক গুরুত্বপূর্ণ অংশটি শুরুতে রয়েছে, যেখানে আমরা যাচাই করি যে $ o অবনমিত নয়; যদি অক্ষর মুছে দেওয়া হয়েছে, তার দৈর্ঘ্য মেলে না হবে 181
, তাই আমরা চালানো zzzz((()))
যা, তা অপ্রতিম বন্ধনী কারণে একটি বাক্য গঠন ত্রুটি নয়, এমনকি যদি আপনি কারণ কেউ এর কোন তিনটি অক্ষর মুছে ফেলতে একটি রানটাইম এরর হতে হবে zzzz
, zzz
, zz
, এবং z
এটি একটি ফাংশন, এবং মুছে ফেলা (((
এবং একটি অযৌক্তিক সিনট্যাক্স ত্রুটি ঘটানো ব্যতীত অন্য কোনও ক্রিয়াকলাপ হিসাবে পার্সিং প্রতিরোধের উপায় নেই । চেক নিজেই ক্ষতির প্রতিরোধী; এর ||
ক্ষতি হতে |
পারে তবে zzzz((()))
কলটি নিঃশর্তভাবে চলতে পারে; ভেরিয়েবল বা ধ্রুবকগুলির ক্ষতিকারক একটি অমিল ঘটায় কারণ আপনি একটির সাথে তুলনা করছেন 0
,180
, 179
, 178
এর সংখ্যা কিছু উপসেট থেকে সমতার জন্য 181
; এবং একটি অপসারণের =
ফলে পার্স ব্যর্থতা দেখা দেয় এবং দু'জনই =
অনিবার্যভাবে এলএইচএসকে পূর্ণসংখ্যা 0 বা একটি নাল স্ট্রিংকে মূল্যায়িত করে, উভয়ই মিথ্যা।
আপডেট : প্রোগ্রামটির পূর্ববর্তী সংস্করণে এই চেকটি কিছুটা ভুল ছিল, সুতরাং সমস্যাটি সমাধানের জন্য আমাকে এটি সম্পাদনা করতে হয়েছিল। পূর্ববর্তী সংস্করণটি ডিকোডের পরে দেখে মনে হয়েছিল:
length$o==179||zzzz((()))
এবং এটি পেতে প্রথম তিনটি বিরাম চিহ্ন মুছে ফেলা সম্ভব হয়েছিল:
lengtho179||zzz((()))
lengtho179
খালি শব্দ হওয়া সত্যবাদী এবং এভাবে চেকটি ভেঙে যায়। আমি অতিরিক্ত দুটি B
অক্ষর (যা স্থানের অক্ষরগুলিকে এনকোড করে) যুক্ত করে এটি স্থির করেছি, অর্থাত কুইনের সর্বশেষতম সংস্করণ এটি করে:
length$o ==181||zzzz((()))
এখন সিনট্যাক্স ত্রুটি তৈরি না করে =
চিহ্ন এবং চিহ্ন দুটিই আড়াল করা অসম্ভব $
। (আমাকে একের পরিবর্তে দুটি স্পেস যোগ করতে হয়েছিল কারণ দৈর্ঘ্যের উত্সটিতে 180
একটি আক্ষরিক 0
চরিত্র তৈরি হবে, যা এই প্রসঙ্গে অপব্যবহার করা যেতে পারে একটি খালি শব্দটির সাথে শূন্যের পূর্ণসংখ্যার তুলনা করতে, যা সফল হয়)) শেষ আপডেট
দৈর্ঘ্যের চেকটি পাস করার পরে, আমরা জানি যে অনুলিপিটি অনাদৃশ্যযুক্ত, কমপক্ষে এটি থেকে চরিত্র মোছার ক্ষেত্রে, সুতরাং এগুলি সমস্ত কিছু কেবল সরলভাবে খাড়া করা (কোনও বিশৃঙ্খল ডিকোডিং টেবিলের কারণে বিরাম চিহ্নগুলির বিকল্পগুলি এই চেকটি ধরা পড়বে না) , তবে আমি ইতিমধ্যে নিষ্ঠুর- বাধ্যতার মাধ্যমে যাচাই করেছি যে কেবল ডিকোডিং টেবিল থেকে কোনও তিনটি মুছে ফেলা কুইনটি ভেঙে দেয়; সম্ভবত তাদের বেশিরভাগই সিনট্যাক্স ত্রুটির কারণ হয়ে থাকে)। আমাদের $o
ইতিমধ্যে একটি চলক রয়েছে, সুতরাং আমাদের যা করতে হবে তা হ'ল বাইরের র্যাপারগুলিকে হার্ডকোড করতে হবে (কিছুটা কম ডিগ্রি সংকোচনের সাথে; আমি প্রশ্নের কোড-গল্ফ অংশটি পুরোপুরি এড়িয়ে যাইনি )। একটি কৌশলটি হ'ল আমরা প্রচুর পরিমাণে এনকোডিং টেবিলটি সঞ্চয় করি$r
; আমরা অভ্যন্তরীণ মোড়কের এনকোডিং টেবিল বিভাগটি তৈরি করতে, বা এর চারপাশে কিছু কোড যুক্ত করতে এবং eval
এটি বিপরীতে ডিকোডিং প্রক্রিয়াটি চালানোর জন্য (us o এর এনকোড সংস্করণটি কী তা নির্ধারণের জন্য আমাদের অনুমতি দিতে) এটি আক্ষরিকভাবে মুদ্রণ করতে পারি , এই পয়েন্টে কেবল ডিকোড করা সংস্করণ উপলব্ধ রয়েছে) available
অবশেষে, আমরা যদি একটি অক্ষত অনুলিপি হয়ে থাকি এবং এভাবে পুরো মূল প্রোগ্রামটি আউটপুট করতে পারি, exit
তবে অন্যান্য অনুলিপিগুলিও প্রোগ্রামটি মুদ্রণের চেষ্টা করতে বাধা দেওয়ার জন্য আমরা কল করি ।
যাচাই স্ক্রিপ্ট
খুব সুন্দর নয়, তবে কেউ জিজ্ঞাসা করার কারণে এটি পোস্ট করছে। আমি এটি বিভিন্ন ধরণের সেটিংস (সাধারণত পরিবর্তিত $min
এবং $max
বিভিন্ন আগ্রহের ক্ষেত্রগুলির জন্য পরীক্ষা করে) নিয়ে দৌড়েছি ; এটি একটি সম্পূর্ণ স্বয়ংক্রিয় প্রক্রিয়া ছিল না। ভারী সিপিইউ লোডের কারণে অন্য কোথাও চালানো বন্ধ করার প্রবণতা রয়েছে; যখন এটি ঘটেছিল, আমি কেবলমাত্র $min
এর প্রথম মানটিতে পরিবর্তিত হয়েছি $x
যা পুরোপুরি চেক করা হয়নি এবং স্ক্রিপ্টটি চালিয়ে যাওয়া অব্যাহত ছিল (সুতরাং এটি নিশ্চিত করে যে পরিসরের সমস্ত প্রোগ্রাম শেষ পর্যন্ত চেক হয়ে গেছে)। আমি কেবল প্রোগ্রামটির প্রথম অনুলিপি থেকে মুছে ফেলা পরীক্ষা করেছিলাম, কারণ এটি সম্পূর্ণ স্পষ্ট যে অন্যান্য অনুলিপিগুলি থেকে মুছে ফেলা আরও কিছু করতে পারে না।
use 5.010;
use IPC::Run qw/run/;
undef $/;
my $program = <>;
my $min = 1;
my $max = (length $program) / 4 - 3;
for my $x ($min .. $max) {
for my $y ($x .. $max) {
for my $z ($y .. $max) {
print "$x, $y, $z\n";
my $p = $program;
substr $p, $x, 1, "";
substr $p, $y, 1, "";
substr $p, $z, 1, "";
alarm 4;
run [$^X, '-M5.010'], '<', \$p, '>', \my $out, '2>', \my $err;
if ($out ne $program) {
print "Failed deleting at $x, $y, $z\n";
print "Output: {{{\n$out}}}\n";
exit;
}
}
}
}
say "All OK!";
Subleq
। আমি মনে করি এটি এই জাতীয় চ্যালেঞ্জের জন্য আদর্শ হবে!