यह सवाल ब्रेन-फ्लैक के पहले जन्मदिन को मनाने के लिए तैयार की गई कई ब्रेन-फ्लैक बर्थडे चुनौतियों में से पहला है! आप ब्रेन-आलोचना का जन्म-दिन के बारे में अधिक जानकारी पा सकते हैं यहाँ
पिछली गर्मियों में हमारे पास ब्रेन-फ्लैक इंटेगर मेटागॉल्फ था , और इससे उत्पन्न उत्तर ब्रेन-फ्लैक समुदाय के लिए बहुत उपयोगी थे। मुख्य बात यह है कि इंटेगर मेटागॉल्फ को इतना कुशल बनाता है एक तकनीक है जिसे गुणन हार्डकोडिंग कहा जाता है।
ब्रेन-फ्लैक रनटाइम गुणा में बहुत महंगा है। सबसे कम ज्ञात गुणन स्निपेट है:
({}<>)({<({}[()])><>({})<>}{}<><{}>)
हालाँकि संकलन समय गुणा करने का एक बहुत ही सरल तरीका है। उदाहरण के लिए निम्न कोड 5 से गुणा होगा:
(({})({})({})({}){})
यह काम करता है क्योंकि लगातार अभिव्यक्तियों को एक साथ जोड़ा जाता है। प्रत्येक ({})
स्टैक के लिए कुछ भी नहीं करता है ( {}
चबूतरे और (..)
इसे पीछे धकेलता है) और स्टैक के शीर्ष पर जो कुछ भी है उसका मूल्यांकन करता है। इन सभी अभिव्यक्तियों को एक साथ पांच गुना तक जोड़ दिया जाता है जो स्टैक के शीर्ष पर था।
किसी भी n
निम्न स्ट्रिंग अभिव्यक्ति के लिए एक स्निपेट बनाया जाएगा जो स्टैक के शीर्ष को गुणा करेगा n
:
"("+"({})"*(n-1)+"{})"
यह ऐसे n
भाव बनाकर काम करता है जो सभी स्टैक के शीर्ष पर मूल्यांकन करते हैं। पहला n-1
वास्तव में कुछ भी नहीं बदलता है और आखिरी धक्का से पहले स्टैक के शीर्ष को हटा देता है।
मिश्रित संख्याओं के लिए आप बाइट्स को बचाने के लिए एक साथ कई छोटे भावों की श्रृंखला बना सकते हैं। उदाहरण के लिए आप 25 को 5 से गुणा करके 5 से गुणा कर सकते हैं:
(({})({})({})({}){})(({})({})({})({}){})
यह बहुत आसान है, और कुछ संख्याओं के लिए यह बहुत अच्छी तरह से काम करता है लेकिन ऐसा करने के बेहतर तरीके हैं। उदाहरण के लिए एक विधि जो मैं आई थी वह संख्या के द्विआधारी प्रतिनिधित्व का उपयोग करती है। ( यहाँ एक पायथन कार्यान्वयन है ) यह नई विधि पहले दिखाई गई सरल स्ट्रिंग अभिव्यक्ति की तुलना में बहुत अधिक प्रभावी है, लेकिन इसका अंत नहीं है, हार्डकोड गुणा करने के लिए सभी तरह के दिलचस्प तरीके हैं और शायद एक टन है जिसे अभी तक किसी ने नहीं खोजा है।
इसलिए मुझे लगता है कि यह देखने का समय है कि हम कितना अच्छा कर सकते हैं।
ब्रेन-फ्लैक का संक्षिप्त अवलोकन
इस चुनौती के लिए ब्रेन-फ्लैक के बारे में आपको जो कुछ भी जानना होगा, उसका विवरण यहां दिया गया है।
ब्रेन-फ्लैक में "निलाड्स" और "मोनाड्स" हैं। निलेड्स कोष्ठक हैं जिनके अंदर कुछ भी नहीं है। प्रत्येक निलाद एक काम करता है और एक मूल्य लौटाता है। इस चुनौती के लिए हम जिन दो निलादों से चिंतित हैं, वे हैं {}
और <>
। {}
सक्रिय स्टैक के शीर्ष को पॉप करता है और उसका मूल्य लौटाता है। <>
सक्रिय स्टैक और सक्रिय स्टैक में स्विच करता है, ताकि सक्रिय स्टैक निष्क्रिय हो जाए और निष्क्रिय स्टैक सक्रिय हो जाए, यह शून्य वापस आ जाता है।
मठ उनके अंदर सामान के साथ कोष्ठक हैं। वे एक ही तर्क लेते हैं, उनके अंदर सब कुछ का योग, कभी-कभी एक कार्रवाई करते हैं, और फिर एक मूल्य वापस करते हैं। इन तीनों से हम संबंधित हैं (...)
, <...>
और [...]
। इस चुनौती के लिए सबसे महत्वपूर्ण मोनाड (...)
अंदर का मूल्य लेता है और इसे सक्रिय स्टैक में धकेल देता है। यह फिर तर्क देता है। <...>
और [...]
दोनों "निष्क्रिय" मोनड हैं, यही है कि वे कोई कार्रवाई नहीं करते हैं, बल्कि उनके द्वारा पारित मूल्य को संशोधित करते हैं। <...>
हमेशा शून्य तर्क की परवाह किए बिना पारित कर दिया। इस बीच [...]
हमेशा तर्क समय देता है -1
।
स्पष्टीकरण के साथ नमूना कार्यक्रम
यदि आपने ब्रेन-फ्लैक में कभी प्रोग्राम नहीं किया है, तो वर्णित ऑपरेशनों का उपयोग करके कुछ उदाहरण कार्यक्रमों को देखना एक अच्छा विचार हो सकता है
({}{})
यह स्टैक पर शीर्ष दो नंबर जोड़ता है। प्रत्येक {}
स्टैक से एक मान निकालता है और (...)
अपनी राशि को पीछे धकेलता है।
({}[{}])
इसी प्रकार यह पहले से स्टैक पर दूसरी वस्तु को घटाता है। जैसे पहले हर {}
एक मान होता है, लेकिन [..]
दूसरे के आसपास इसे जोड़ने का कारण बनता है। एक बार फिर से (...)
योग बढ़ता है।
({}<{}>)
यह स्टैक पर दूसरे मूल्य को हटा देता है जिससे शीर्ष मूल्य बरकरार रहता है। यह पिछले दो की तरह ही काम करता है सिवाय दूसरे मूल्य के चुप हो जाता है <...>
इसलिए धक्का केवल पहले मूल्य को पीछे धकेलता है।
(({}))
यह स्टैक के शीर्ष पर मूल्य की दूसरी प्रतिलिपि बनाता है। यह स्टैक के शीर्ष को {}
अपने मूल्य के साथ पॉपिंग करके ऐसा करता है , पहले (..)
इसके मूल्य का मूल्यांकन करने के बाद इसे वापस धकेलता है। दूसरा (...)
पहले द्वारा लौटाया गया मान लेता है और स्टैक को भी धक्का देता है। दूसरी प्रति बनाना।
कार्य
पूर्णांक को देखते हुए n
स्टैक-क्लीन ब्रेन-फ्लैक स्निपेट बनाएं जो वर्तमान स्टैक के शीर्ष को गुणा करता है n
।
आपको निम्नलिखित ब्रेन-फ्लैक संचालन का उपयोग करने की अनुमति है
(...) -> Push Monad, Pushes the result of its contents
<...> -> Zero Monad, Returns zero
[...] -> Negative Monad, Returns the opposite of its contents result
{} -> Pop nilad, Pops the TOS and returns its value
<> -> Switch nilad, Switches the active and inactive stack
अन्य कार्यों को चुनौती के उद्देश्य से प्रतिबंधित किया गया है।
स्कोरिंग
आपका स्कोर से सभी कार्यक्रमों की संचयी लंबाई हो जाएगा n=2
करने के लिए n=10000
। सत्यापन के लिए अपने कार्यक्रम के आउटपुट के लिए एक लिंक शामिल करना सुनिश्चित करें।
[...]
, इसलिए यह एक शुरुआत है।