थर्ड स्टैक का इस्तेमाल करें
यदि आपने शीर्षक पढ़ा है तो आप थोड़ा भ्रमित हो सकते हैं। निश्चित रूप से ब्रेन-फ्लैक में केवल दो ढेर हैं? हालांकि मैं आपको विश्वास दिलाता हूं कि यह मौजूद है और यह सबसे शक्तिशाली में से एक है, अगर यह ब्रेन-फ्लाक लेखन और गोल्फ में सबसे शक्तिशाली उपकरण नहीं है।
"तीसरा स्टैक" क्या है?
हर ब्रेन-फ्लैक प्रोग्राम एक या दूसरे तरीके से तीसरे स्टैक का उपयोग करता है, लेकिन ज्यादातर उपयोग पर्दे के पीछे होता है और यह अक्सर इस तथ्य को अनदेखा करने के लिए उपयोगी होता है कि यह मौजूद है। कार्यक्रम में प्रत्येक कोष्ठक या तो स्टैक से एक आइटम को जोड़ता है या हटाता है। खुले ब्रेसिज़ में से ([<
तीन स्टैक में एक आइटम जोड़ते हैं जबकि उनके तीन संयुग्म होते हैं)]>
सभी स्टैक से एक आइटम को हटाते हैं। स्टैक पर आइटम का मूल्य कार्यक्रम के वर्तमान दायरे का मूल्य है और निलाड्स का उपयोग करके इस मूल्य को कुछ तरीकों से संशोधित किया जाएगा। करीब कोष्ठक )
में तीसरे स्टैक से एक तत्व को चालू स्टैक तक ले जाने का अनूठा कार्य है; एक धक्का।
उम्मीद है कि यह आपके लिए स्पष्ट हो रहा है। थर्ड स्टैक कुछ प्रकार का स्टैक है जो कोड के रिटर्न वैल्यूज को याद करता है जिसे पहले ही निष्पादित किया जा चुका है। चलो दो सामान्य स्टैक और तीसरे स्टैक का ट्रैक रखते हुए एक सरल कार्यक्रम के उदाहरण के माध्यम से चलते हैं।
उदाहरण
हम निम्नलिखित कार्यक्रम के माध्यम से चलेंगे। यह कार्यक्रम -3, 1, -2
स्टैक को धक्का देता है।
(([()()()])(()))
हम तीन खुले ब्रेसिज़ के साथ शुरू करते हैं, जो सभी एक शून्य से तीसरे स्टैक तक पहुंचते हैं।
हमारे स्टैक अब इस तरह दिखते हैं, तीसरा स्टैक दाईं ओर है और ^
इसके नीचे सक्रिय स्टैक है :
0
0
0 0 0
^
(([()()()])(()))
^
अब हम तीन ()
nilads है। ये सामान्य दो स्टैक के लिए कुछ भी नहीं करते हैं, हालांकि वे तीसरे स्टैक के शीर्ष पर एक जोड़ते हैं जो हमारे स्टैक को लुक देते हैं:
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 से कम सभी संख्याओं का योग है।
एक दृष्टिकोण अपस्टैक पर एक संचायक बनाने और इसे नीचे जोड़ने के रूप में जोड़ सकता है। यह ऐसा कोड बनाता है जो इस तरह दिखता है:
(<>)<>{(({}[()])()<>{})<>}{}<>({}<>)
इसे ऑनलाइन आज़माएं!
यह कोड बहुत कॉम्पैक्ट है और कोई सोच सकता है कि यह बहुत छोटा नहीं हो सकता। हालाँकि अगर हम इसे तीसरे स्टैक के दृष्टिकोण से देखें तो यह स्पष्ट हो जाता है कि यह स्थूल रूप से अक्षम है। अपने संचायक को ऑफस्टैक पर रखने के बजाय हम इसे तीसरे स्टैक पर रख सकते हैं (
और इसे अंत में हम उपयोग करते हैं )
। हम एक बार फिर सभी नंबरों के माध्यम से लूप करेंगे, लेकिन इस बार हमें अपने तीसरे स्टैक को बढ़ाने के लिए ज्यादा कुछ नहीं करना है, कार्यक्रम हमारे लिए करता है। ऐसा दिखता है:
({()({}[()])}{})
इसे ऑनलाइन आज़माएं
यह कोड हमारे द्वारा पहले बनाए गए सुंदर वेल गोल्फ संस्करण के आधे से भी कम आकार का है। वास्तव में एक कंप्यूटर खोज ने साबित कर दिया है कि यह कार्यक्रम सबसे कम संभव कार्यक्रम है जो इस कार्य को कर सकता है। इस कार्यक्रम को "सभी रन के योग" दृष्टिकोण का उपयोग करके समझाया जा सकता है, लेकिन मुझे लगता है कि थर्ड स्टैक दृष्टिकोण का उपयोग करके समझाया गया यह बहुत अधिक सहज और स्पष्ट है।
मैं तीसरे स्टैक का उपयोग कब करूं?
आदर्श रूप से जब भी आप ब्रेन-फ्लैक में एक नई समस्या पर काम शुरू करते हैं तो आपको खुद से सोचना चाहिए कि मैं थर्ड स्टैक को ध्यान में रखते हुए ऐसा कैसे करूंगा। हालाँकि, अंगूठे के एक सामान्य नियम के रूप में, जब भी आपको किसी प्रकार के संचायक का ध्यान रखना होता है या एक कुल चलना होता है, तो यह एक अच्छा विचार है कि दो असली ढेर के बजाय अपने तीसरे स्टैक पर डाल दें।
दूसरी बार जब आपके तीसरे स्टैक का उपयोग करने पर विचार करना एक अच्छा विचार हो सकता है, जब आपके पास अन्य दो स्टैक पर कुछ मूल्य संग्रहीत करने के लिए कोई स्थान नहीं है। यह विशेष रूप से तब उपयोगी हो सकता है जब आप दो मौजूदा स्टैक पर जोड़तोड़ कर रहे हों और आप बाद में उपयोग के लिए कोई मान बचाना चाहते हों, जहां वह है, उसका ट्रैक रखें।
तीसरे स्टैक की सीमाएं
थर्ड स्टैक बहुत तरीकों से बहुत शक्तिशाली है लेकिन यह अपनी सीमाओं और कमियों के साथ आता है।
सबसे पहले, किसी भी बिंदु पर तीसरे स्टैक के लिए अधिकतम स्टैक की ऊंचाई संकलन समय पर निर्धारित की जाती है। इसका मतलब यह है कि यदि आप स्टैक पर जगह की मात्रा का उपयोग करना चाहते हैं तो आपको उस जगह को आवंटित करना होगा जब आप प्रोग्राम लिख रहे हैं।
दूसरे थर्ड स्टैक रैंडम एक्सेस नहीं है। इसका मतलब यह है कि आप किसी भी मूल्य पर कोई ऑपरेशन नहीं कर सकते हैं लेकिन सबसे ऊपर का मूल्य है। इसके अलावा आप स्टैक पर मानों को स्थानांतरित नहीं कर सकते (कहते हैं कि पहले दो तत्वों को स्वैप करें)।
निष्कर्ष
तीसरा स्टैक एक शक्तिशाली उपकरण है और मैं इसे हर ब्रेन-फ्लैक उपयोगकर्ता के लिए आवश्यक मानता हूं। ब्रेन-फ्लैक में प्रोग्रामिंग के बारे में आपके सोचने के तरीके में बदलाव की आवश्यकता होती है, लेकिन जब इसे सही तरीके से इस्तेमाल किया जाता है तो यह एक सभ्य और आश्चर्यजनक के बीच का अंतर बना देता है।
प्रवंचक पत्रक
यहां ऑपरेशन की एक सूची दी गई है और वे तीसरे स्टैक को कैसे प्रभावित करते हैं
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