ब्रेनफ्लक गुणन मेटगाल्फ


17

यह सवाल ब्रेन-फ्लैक के पहले जन्मदिन को मनाने के लिए तैयार की गई कई ब्रेन-फ्लैक बर्थडे चुनौतियों में से पहला है! आप ब्रेन-आलोचना का जन्म-दिन के बारे में अधिक जानकारी पा सकते हैं यहाँ

पिछली गर्मियों में हमारे पास ब्रेन-फ्लैक इंटेगर मेटागॉल्फ था , और इससे उत्पन्न उत्तर ब्रेन-फ्लैक समुदाय के लिए बहुत उपयोगी थे। मुख्य बात यह है कि इंटेगर मेटागॉल्फ को इतना कुशल बनाता है एक तकनीक है जिसे गुणन हार्डकोडिंग कहा जाता है।

ब्रेन-फ्लैक रनटाइम गुणा में बहुत महंगा है। सबसे कम ज्ञात गुणन स्निपेट है:

({}<>)({<({}[()])><>({})<>}{}<><{}>)

मेगाटॉम द्वारा खोजा गया

हालाँकि संकलन समय गुणा करने का एक बहुत ही सरल तरीका है। उदाहरण के लिए निम्न कोड 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। सत्यापन के लिए अपने कार्यक्रम के आउटपुट के लिए एक लिंक शामिल करना सुनिश्चित करें।


1
ब्याज से बाहर, 1 और लूप संचालन पर प्रतिबंध क्यों लगाया जाता है?
नील

@Neil स्टैक ऊंचाई ऑपरेटर भी प्रतिबंधित है।
आउटगोल्फर

1
@EriktheOutgolfer मैं पहले से ही इस बात पर प्रतिबंध लगा चुका हूं कि किसी भी तरह पूर्णांक मेटाफॉल्फ में।
नील

7
कंप्यूटर वैज्ञानिक अजीब हैं। वे प्रोग्रामिंग भाषाओं का आविष्कार करते हैं जो असंभव रूप से विरोधी गोल्फ का उपयोग करने के लिए असंभव हैं, और फिर इस भाषा में सरल समस्याओं को हल करने के लिए एक दूसरे को गोल्फ कोड लिखने के लिए चुनौती देते हैं। इससे ज्यादा गूढ़ कुछ भी नहीं है। +1 अच्छा सर।
Draco18s अब

1
@ Qwerp-Derp मैंने लिंक किए गए पायथन प्रोग्राम (वर्तमान स्कोर 681950) के आउटपुट को अनुकूलित करने पर ध्यान दिया और 4492 का एक तुच्छ बचत का उपयोग करते हुए पाया [...], इसलिए यह एक शुरुआत है।
नील

जवाबों:


2

रूबी, 669856

$answers = Hash.new{|hash,n|
  valid = []
  2.upto(n**0.5){|i|
    valid.push("("+hash[n/i]+")"+"({})"*(i-2)+"{}") if n%i == 0
  }
  valid.push("({})"+hash[n-1])
  (hash[n] = valid.min_by{|s| s.length})
}
$answers[1] = "{}"

def full_answer n
  "("+$answers[n]+")"
end

यह एक त्वरित आधारभूत उत्तर है। पहले 1000 मिनट-कार्यक्रम यहां मिले । (मैंने उन सभी को पोस्ट करने की कोशिश की, लेकिन यह अधिकतम पेस्टिबिन आकार को अधिभारित करता है।) मैं बाद में एक कोड स्पष्टीकरण जोड़ सकता हूं।

उदाहरण:

360:    ((((((({})(({}){}){})({}){})({}){}){}){}){})
4608:   (((((((((((({})({}){})({}){}){}){}){}){}){}){}){}){}){})
9991:   (({})((({})(((((((({})((({})({}){}){}){}){}){}){}){}){}){}){})({}){}){})
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.