:-:_
এটি অনলাইন চেষ্টা করুন! ফুটারে আমি অন্যান্য সমস্ত 4-বাইট সমাধান অন্তর্ভুক্ত করেছি। (স্ট্যাক বিড়ালরা প্রথম লাইনফিডের পরে সবকিছু উপেক্ষা করে।)
বিপরীত চেষ্টা করুন!
ব্যাখ্যা
-n
সাংখ্যিক আউটপুট থাকা ফ্ল্যাগ পালাক্রমে (এবং ইনপুট, কিন্তু আমরা কোন না), এবং -m
পতাকা স্বাভাবিকভাবে শুধু একটি golfing সুবিধা যা আপনি উত্স কোডের অপ্রয়োজনীয় অংশ এড়াতে করার সুযোগ দিচ্ছে। এটি কারণ প্রতিটি স্ট্যাক বিড়াল প্রোগ্রামে আয়না প্রতিসাম্য থাকা প্রয়োজন। সঙ্গে -m
পতাকা আপনি শুধু এটা প্রথমার্ধে (প্লাস কেন্দ্রীয় চরিত্র) দেব। সুতরাং এখানে আসল প্রোগ্রামটি হ'ল:
:-:_:-:
আপনি প্রথম টিআইও লিঙ্কটিতে দেখতে পাচ্ছেন, 4 টো বাইট সমাধানের একটি টন রয়েছে, তবে আমি এটির সরলতার জন্য এটি বেছে নিয়েছি। স্ট্যাক বিড়ালগুলি স্ট্যাক-ভিত্তিক, এবং এই প্রোগ্রামটি কেবলমাত্র প্রাথমিক স্ট্যাক ব্যবহার করে। যেহেতু আমাদের কোনও ইনপুট নেই, তাই এতে -1
শূন্যের অসীম কূপের শীর্ষে একটি একক (একটি ইওএফ চিহ্নিতকারী) রয়েছে। প্রোগ্রামে তিনটি কমান্ডের নিম্নলিখিত অর্থ রয়েছে:
: Swap the top two stack elements.
- Negate the top stack element (i.e. multiply by -1).
_ Pop a. Peek b. Push b-a.
সুতরাং এখানে কীভাবে প্রোগ্রামটি স্ট্যাকটি সংশোধন করে (প্রতিটি কমান্ড কীভাবে স্ট্যাকটিকে এক রাজ্য থেকে পরের স্থানে পরিবর্তন করে তা নির্দেশ করে স্টেটস এবং স্টেটসগুলি স্থির থাকে):
: - : _ : - :
-1 0 0 -1 1 0 0 1
0 -1 -1 0 0 1 1 0
0 0 0 0 0 0 0 0
… … … … … … … …
দেখা যাচ্ছে যে এখানে কেবল কিছু করতে পারে এমন একমাত্র আদেশ হ'ল _
আমাদের ইওএফ চিহ্নিতকারীকে একটি হিসাবে রূপান্তরিত করে 1
। প্রোগ্রামের শেষে আউটপুট অন্তর্ভুক্ত, এবং ইওএফ চিহ্নিতকারী alচ্ছিক, তাই এটি কেবল আমাদের পাওয়া প্রিন্ট করে 1
।
অন্তর্ভুক্ত মিররটির কারণে যদি আমরা উত্স কোডটি উল্টে করি তবে আসল প্রোগ্রামটি হয়ে যায়:
_:-:-:_
এটি খুব আলাদা কিছু করে:
_ : - : - : _
-1 1 0 0 1 -1 0 -1
0 0 1 1 0 0 -1 -1
0 0 0 0 0 0 0 0
… … … … … … … …
এইবার স্ট্যাকের নীচে হয় এখনও একটি -1
তাই এটি ফাইলের শেষে মার্কার এবং শুধুমাত্র হিসাবে কাজ করে -1
এটি উপরে মুদ্রিত হয়।
...
এখন এই সমস্ত কথার সাথে, যেহেতু স্ট্যাক বিড়ালগুলির বিপরীত কোডের সাথে এর সাথে একটি অনন্য সম্পর্ক রয়েছে, তাই আমি অনুভব করি যে ব্যবহারটি -m
কিছুটা প্রতারণা is এটি সাধারণত উত্স কোডের অপ্রয়োজনীয় অংশ বাদ দিয়ে বাইটগুলি সংরক্ষণ করে বোঝানো হয়, তবে এখানে এটি চ্যালেঞ্জটিকে অনেক সহজ এবং সম্পূর্ণ প্রোগ্রামকে আরও ছোট করে তোলে। এটি কারণ একটি সম্পূর্ণ প্রোগ্রামকে বিপরীত করা কেবল তখনই প্রোগ্রামটি পরিবর্তন করতে পারে যদি এর মধ্যে কোনও থাকে তবে এর <>[]
অর্থ হ'ল প্রোগ্রামটি একাধিক স্ট্যাকের ব্যবহার শেষ করে দেয় (স্ট্যাক বিড়ালগুলিতে আসলে স্ট্যাকের একটি টেপ থাকে, যেখানে প্রাথমিকটি বাদ দিয়ে কেবল সমস্তই পূরণ করা হয় জিরো দিয়ে শুরু করা)। তদ্ব্যতীত, এটির বিপরীতকরণের পরে কেবলমাত্র <>
এবং []
জোড়াগুলি অদলবদল হয় , যা এখনও কার্যকর করে প্রতিসাম্যকে পরিণত করে। সেই প্রতিসাম্যতা ভাঙার একমাত্র উপায় হ'ল I
কোনটি ব্যবহার করে -]
বা হয়-[
বা স্ট্যাকের শীর্ষের চিহ্নের উপর নির্ভর করে কিছুই নয়। তাই ...
*|]I*:*I[|*
এটি অনলাইন চেষ্টা করুন! পাদলেখকক্ষেত্রে আবার একই বাইট গণনায় অন্য সমস্ত বিকল্প অন্তর্ভুক্ত রয়েছে। প্রতিটি প্রোগ্রামের পরে নির্দেশিত হিসাবে সেইগুলি আউটপুট 1 / -1 এবং কিছু আউটপুট 2 / -2। আমি আউটপুট 2 এর মধ্যে একটি হিসাবে এলোমেলোভাবে কিন্ডা ব্যাখ্যা করতে এইটিকে বেছে নিয়েছি 2।
বিপরীত চেষ্টা করুন!
ব্যাখ্যা
আমি যেমন বলেছি, এটি কিছুটা দীর্ঘ longer এমনকি যদি আমরা এর -m
জন্য স্বরলিপিটি ব্যবহার করি তবে এটি ওপরের 4 টির পরিবর্তে 6 বাইটে ওজনের হবে।
এই সময় ব্যবহৃত কমান্ডগুলি:
* Toggle the least significant bit of the top of the stack.
| Reverse the longest non-zero of prefix on this stack.
[] Move one stack to the left/right and take the top of the current stack with you.
I If the top of the stack is positive, -], if it's negative, -[, otherwise do nothing.
: Swap the top two stack elements.
প্রথম প্রোগ্রামটিতে দুটি স্ট্যাক ব্যবহার করা হয়। এটি ASCII শিল্প করতে কিছুটা অগোছালো তবে আমি যথাসাধ্য চেষ্টা করব। বর্গাকার বন্ধনীর সাহায্যে টেপ মাথাটি কোন স্ট্যাকের দিকে রয়েছে তা নির্দেশ করে এবং আমি স্ট্যাকের প্রতিটি জোড়ের মধ্যে কমান্ডগুলি রেখে দেব।
[-1]
… 0 0 …
0 0
… …
*
[-2]
… 0 0 …
0 0
… …
| (does nothing)
]
[-2]
… 0 0 …
0 0
… …
I
[2]
… 0 0 …
0 0
… …
*
[3]
… 0 0 …
0 0
… …
:
[0]
… 3 0 …
0 0
… …
*
[1]
… 3 0 …
0 0
… …
I
[-1]
… 3 0 …
0 0
… …
[
[-1]
… 3 0 …
0 0
… …
|
[ 3]
… -1 0 …
0 0
… …
*
[ 2]
… -1 0 …
0 0
… …
এখন -1
ইওএফ চিহ্নিতকারী হিসাবে কাজ করে এবং এটি 2
মুদ্রিত হয়।
অন্যান্য প্রোগ্রাম একই না হওয়া পর্যন্ত [
। এটি এখনও দ্বিতীয় দিক পর্যন্ত কার্যত একইরকম I
। আমরা প্রযুক্তিগতভাবে একটি পৃথক স্ট্যাকের মধ্যে থাকব, তবে সেগুলির কোনও মূল্য ছাড়াই তারা সকলেই পৃথক পৃথক। কিন্তু তারপর মধ্যে পার্থক্য I[
এবং I]
শেষ পর্যন্ত mattering:
*|[I*:*I
[-1]
… 3 0 0 …
0 0 0
… … …
]
[-1]
… 3 0 0 …
0 0 0
… … …
| (does nothing)
*
[-2]
… 3 0 0 …
0 0 0
… … …
এবং এইবার, আমাদের কাছে কোনও ইওফ চিহ্নিতকারী নেই, তবে প্রোগ্রামটি এখনও ফলাফলগুলি আউটপুট করে -2
।
-
জেলিতে বাইট স্তর (0x45 = 0b00101101) এর পরিবর্তে বাইট স্তরের পরিবর্তে বিট স্তরে বিপরীত হতে পারি --
এটি আক্ষরিক -1 সংজ্ঞায়িত করার পরে -1 ফলন দেয়, যখনṆ
(0xB4 = 0b10110100) ফলন করে যেহেতু এটি যৌক্তিক না করে শূন্যের অন্তর্নিহিত ইনপুট এর। (অবশ্যইṆ
ঠিক পাশাপাশি কাজ করে: পি)