তৃতীয় স্ট্যাক ব্যবহার করুন
আপনি যদি শিরোনামটি পড়ে থাকেন তবে আপনি কিছুটা বিভ্রান্ত হতে পারেন। ব্রেইন ফ্ল্যাঙ্কে নিশ্চয়ই কেবল দুটি স্ট্যাক রয়েছে? তবে আমি আপনাকে আশ্বাস দিচ্ছি যে এটি বিদ্যমান এবং এটি ব্রেন-ফ্লাককে লেখার এবং গল্ফ করার সবচেয়ে শক্তিশালী সরঞ্জাম না হলে এটি অন্যতম শক্তিশালী।
"তৃতীয় স্ট্যাক" কী?
প্রতিটি ব্রেইন-ফ্ল্যাক প্রোগ্রাম তৃতীয় স্ট্যাকটি একভাবে বা অন্য কোনও উপায়ে ব্যবহার করে তবে বেশিরভাগ ব্যবহার পর্দার আড়ালে চলে যায় এবং প্রায়শই এটি উপস্থিত থাকা সত্যটি উপেক্ষা করার জন্য দরকারী। প্রোগ্রামের প্রতিটি প্রথম বন্ধনী স্ট্যাক থেকে একটি আইটেম যুক্ত বা সরিয়ে দেয়। তিনটি উন্মুক্ত ধনুর্বন্ধনী ([<
সমস্ত স্ট্যাকের সাথে একটি আইটেম যুক্ত করে যখন তাদের তিনটি সংঘবদ্ধ )]>
সমস্ত স্ট্যাক থেকে একটি আইটেম সরান। স্ট্যাকের আইটেমটির মান হ'ল প্রোগ্রামের বর্তমান সুযোগের মান এবং নীলাদগুলি ব্যবহার করে এই মানটি নির্দিষ্ট উপায়ে সংশোধন করা হবে। ঘনিষ্ঠ বন্ধনীর )
তৃতীয় স্ট্যাক থেকে বর্তমান স্ট্যাকে কোনও উপাদান সরানোর অনন্য কার্যকারিতা রয়েছে; একটি ধাক্কা.
আশা করি এটি আপনার কাছে স্পষ্ট হয়ে উঠছে। তৃতীয় স্ট্যাক এমন এক ধরণের স্ট্যাক যা ইতিমধ্যে সম্পাদিত হওয়া কোডের রিটার্ন মানগুলি স্মরণ করে। আসুন দুটি সাধারণ স্ট্যাক এবং তৃতীয় স্ট্যাকের উপর নজর রাখার একটি সাধারণ প্রোগ্রামের উদাহরণ দিয়ে আসি।
উদাহরণ
আমরা নিম্নলিখিত প্রোগ্রামের মাধ্যমে হাঁটা করব। এই প্রোগ্রামটি -3, 1, -2
স্ট্যাকের দিকে ধাক্কা দেয় ।
(([()()()])(()))
আমরা তিনটি উন্মুক্ত ধনুর্বন্ধনী দিয়ে শুরু করি, যা সমস্ত তৃতীয় স্ট্যাকের শূন্যকে চাপায়।
আমাদের স্ট্যাকগুলি এখন এটি দেখতে দেখতে, তৃতীয় স্ট্যাকটি ডানদিকে একটি এবং সক্রিয় স্ট্যাকের ^
নীচে রয়েছে:
0
0
0 0 0
^
(([()()()])(()))
^
এখন আমাদের তিনটি ()
নীলাদ রয়েছে। এগুলি দুটি সাধারণ স্ট্যাকের সাথে কিছু করে না, তবে তারা প্রতিটি তৃতীয় স্ট্যাকের শীর্ষে একটি করে যুক্ত করে আমাদের স্ট্যাকগুলি দেখতে দেখতে:
3
0
0 0 0
^
(([()()()])(()))
^
এখন আমরা মুখোমুখি ]
বন্ধনীগুলির তৃতীয় স্ট্যাক থেকে কোনও আইটেম অপসারণ করার পূর্বে উল্লিখিত মতামতটির মুখোমুখি হয়েছি তবে ]
এটি স্ট্যাকের উপরের অংশ থেকে সরানো উপাদানটি বিয়োগ করার কাজ করে। এইভাবে আমাদের নতুন স্ট্যাকগুলি দেখতে পাবেন:
-3
0 0 0
^
(([()()()])(()))
^
এইবার বুঝতে পারছি; [...]
অবহেলা তাই ]
নীচের দিকে বিয়োগ করা উচিত।
এখন আমাদের অবশ্যই একটি কার্যকর করা উচিত )
। আপনার সম্ভবত স্মরণ হিসাবে )
প্রোগ্রামের জায়গাটি যেখানে স্ট্যাকগুলি স্ট্যাকের দিকে ঠেলে দেওয়া হয় তাই আমরা তৃতীয় স্ট্যাকের শীর্ষটিকে বর্তমান স্ট্যাকের দিকে নিয়ে যাব -3
, তৃতীয় স্ট্যাকের পরবর্তী উপাদানগুলিতে আমরা যুক্ত করব ।
-3 0 -3
^
(([()()()])(()))
^
আবার আমাদের তিনটি উন্মুক্ত ধনুর্বন্ধনীগুলির মধ্যে একটির মুখোমুখি হ'ল যাতে আমরা আমাদের তৃতীয় স্ট্যাকের সাথে আরও একটি উপাদান যুক্ত করব।
0
-3 0 -3
^
(([()()()])(()))
^
যেমনটি আমরা আগেই বলেছিলাম ()
আমাদের তৃতীয় স্ট্যাকের শীর্ষটিকে এক এক করে বাড়িয়ে দেবে।
1
-3 0 -3
^
(([()()()])(()))
^
এবং )
তৃতীয় স্ট্যাকের শীর্ষটি সক্রিয় স্ট্যাকের উপরে সরানো হবে এবং নীচের দিকে যুক্ত করবে
1
-3 0 -2
^
(([()()()])(()))
^
শেষটি )
তৃতীয় স্ট্যাকটিকে সক্রিয় স্ট্যাকের দিকে নিয়ে যায় এবং যেহেতু এটি যুক্ত করার জন্য তৃতীয় স্ট্যাকের কোনও উপাদান অবশিষ্ট নেই, অন্য কিছুই করে না।
-2
1
-3 0
^
(([()()()])(()))
^
প্রোগ্রামটি শেষ হয়ে গেছে তাই আমরা সমাপ্তি এবং আউটপুট।
এই উদাহরণটি আপনাকে তৃতীয় স্ট্যাকটি কী এবং কী করে তা অনুভব করার উদ্দেশ্যে। এতে সমস্ত অপারেশন অন্তর্ভুক্ত নয়, তবে আশা করি আপনি তাদের প্রতিটি কী করে তা নিজেই বুঝতে পারবেন। আপনি যদি এখনও লড়াই করে থাকেন তবে আপনাকে সহায়তা করতে আমি এই উত্তরের নীচে একটি "চিটশিট" অন্তর্ভুক্ত করেছি।
ঠিক আছে, তাহলে কি?
ঠিক আছে, এখন আপনি তৃতীয় স্ট্যাক বুঝতে পারছেন, তবে "তাই কি"? আপনি এটি "তৃতীয় স্ট্যাক" না বললেও আপনি ইতিমধ্যে এটি ব্যবহার করেছিলেন, তৃতীয় স্ট্যাকের বিবেচনায় ভাবনা আপনাকে গল্ফকে কীভাবে সহায়তা করে?
একটি সমস্যা তাকান। আপনি একটি সংখ্যার ত্রিভুজ নিতে চান । এটি n এর চেয়ে কম সংখ্যার যোগফল।
একটি পদ্ধতি হতে পারে অফস্ট্যাকে একটি সংযোজক তৈরি করা এবং আপনি নিচে নামার সাথে যুক্ত করা। এটি এমন দেখায় এমন কোড তৈরি করে:
(<>)<>{(({}[()])()<>{})<>}{}<>({}<>)
অনলাইনে চেষ্টা করে দেখুন!
এই কোডটি বেশ কমপ্যাক্ট এবং কেউ ভাবেন যে এটি আরও ছোট হতে পারে না। তবে আমরা যদি এটির তৃতীয় স্ট্যাক দৃষ্টিকোণ থেকে যোগাযোগ করি তবে এটি স্পষ্ট হয়ে যায় যে এটি চূড়ান্তভাবে অক্ষম। অফস্যাকটিতে আমাদের সংযোজকটি রাখার পরিবর্তে আমরা এটিকে তৃতীয় স্ট্যাকের সাথে (
রাখতে পারি এবং আমরা ব্যবহার শেষে এটি পুনরুদ্ধার করতে পারি )
। আমরা আবার সমস্ত সংখ্যার মধ্য দিয়ে লুপ করব, তবে এবার আমাদের তৃতীয় স্ট্যাকটি বাড়ানোর জন্য আমাদের কিছু করার দরকার নেই, প্রোগ্রামটি আমাদের জন্য এটি করে। এটির মতো দেখাচ্ছে:
({()({}[()])}{})
এটি অনলাইনে চেষ্টা করুন
এই কোডটি আমরা এর আগে তৈরি বেশ সুন্দর গল্ফযুক্ত সংস্করণের অর্ধেকেরও কম আকারের। প্রকৃতপক্ষে একটি কম্পিউটার অনুসন্ধান প্রমাণ করেছে যে এই প্রোগ্রামটি সবচেয়ে কম সম্ভাব্য প্রোগ্রাম যা এই কাজটি সম্পাদন করতে পারে। এই প্রোগ্রামটি "সমস্ত রানের যোগফল" পদ্ধতির সাহায্যে ব্যাখ্যা করা যেতে পারে তবে তৃতীয় স্ট্যাক পদ্ধতির সাহায্যে ব্যাখ্যা করার সময় এটি অনেক বেশি স্বজ্ঞাত এবং পরিষ্কার বলে আমি মনে করি।
আমি কখন তৃতীয় স্ট্যাক ব্যবহার করব?
আদর্শভাবে যখনই আপনি মস্তিষ্ক-ফ্ল্যাঙ্কে কোনও নতুন সমস্যার কাজ শুরু করেন আপনার নিজেরাই ভেবে দেখা উচিত যে আমি কীভাবে তৃতীয় স্ট্যাকটি মাথায় রেখে এটি করব। তবে থাম্বের সাধারণ নিয়ম হিসাবে যখনই আপনাকে কোনও প্রকারের সঞ্চালককে ট্র্যাক রাখতে হয় বা মোট চলতে থাকে তবে দুটি আসল স্ট্যাকের পরিবর্তে এটি আপনার তৃতীয় স্ট্যাকের উপর রেখে চেষ্টা করা ভাল ধারণা।
অন্য সময় যখন আপনার তৃতীয় স্ট্যাকটি ব্যবহার করা বিবেচনা করা ভাল তবে আপনি যখন অন্য দুটি স্ট্যাকের কোনও মূল্য সঞ্চয় করার মতো জায়গা রাখেন না। এটি বিশেষত কার্যকর যখন আপনি দুটি বিদ্যমান স্ট্যাকগুলিতে ম্যানিপুলেশনগুলি করতে পারেন এবং আপনি এটির অবস্থানটি ট্র্যাক না করেই পরে ব্যবহারের জন্য একটি মান সংরক্ষণ করতে চান।
তৃতীয় স্ট্যাকের সীমাবদ্ধতা
তৃতীয় স্ট্যাকটি অনেক উপায়ে খুব শক্তিশালী তবে এটি নিজস্ব সীমাবদ্ধতা এবং ত্রুটিগুলি নিয়ে আসে।
প্রথমত, যে কোনও বিন্দুতে তৃতীয় স্ট্যাকের সর্বাধিক স্ট্যাকের উচ্চতা সংকলনের সময় নির্ধারিত হয়। এর অর্থ হ'ল আপনি যদি স্ট্যাকের পরিমাণের পরিমাণ ব্যবহার করতে চান তবে প্রোগ্রামটি লেখার সময় আপনাকে সেই স্থানটি বরাদ্দ করতে হবে।
দ্বিতীয়ত তৃতীয় স্ট্যাকটি র্যান্ডম অ্যাক্সেস নয়। এর অর্থ হ'ল আপনি কোনও মানের উপরে কোনও ক্রিয়াকলাপ করতে পারবেন না তবে শীর্ষ সর্বাধিক মান। এছাড়াও আপনি স্ট্যাকের চারপাশে মানগুলি স্থানান্তর করতে পারবেন না (প্রথম দুটি উপাদানকে অদলবদল বলুন)।
উপসংহার
তৃতীয় স্ট্যাক একটি শক্তিশালী সরঞ্জাম এবং আমি এটি প্রতিটি ব্রেইন-ফ্ল্যাক ব্যবহারকারীদের জন্য অপরিহার্য বিবেচনা করব। ব্রেন-ফ্ল্যাঙ্কে প্রোগ্রামিং সম্পর্কে আপনার চিন্তাভাবনাটি বদলে দেওয়ার জন্য কিছুটা অভ্যস্ত হয়ে যায় এবং সঠিকভাবে ব্যবহার করা গেলে এটি গল্ফ করার সময় একটি শালীন এবং আশ্চর্য্যের মধ্যে সমস্ত পার্থক্য তৈরি করে।
Cheatsheet
এখানে অপারেশনগুলির একটি তালিকা রয়েছে এবং তারা কীভাবে তৃতীয় স্ট্যাককে প্রভাবিত করে is
Operation | Action
====================================================
(,[,< | Put a zero on top of the Third Stack
----------------------------------------------------
) | Add the top of the Third Stack to the
| second element and move it to the
| active stack
----------------------------------------------------
] | Subtract the top of the Third Stack
| from the second element and pop it
----------------------------------------------------
> | Pop the top of the Third Stack
----------------------------------------------------
() | Add one to the top of the Third Stack
----------------------------------------------------
{} | Pop the top of the active stack and
| add it to the top of the Third Stack
----------------------------------------------------
[] | Add the stack height to the Third
| Stack
----------------------------------------------------
<>,{,} | Nothing