जब मैंने इस बंद प्रश्न का शीर्षक देखा , तो मुझे लगा कि यह एक दिलचस्प कोड गोल्फ चुनौती है। तो मुझे इसे इस तरह प्रस्तुत करें:
चुनौती:
एक प्रोग्राम, एक्सप्रेशन या सबरूटीन लिखें, जो कि इनफिक्स नोटेशन में एक अंकगणितीय अभिव्यक्ति देता है , जैसे 1 + 2, पोस्टफिक्स नोटेशन में एक ही अभिव्यक्ति को आउटपुट करता है , अर्थात 1 2 +।
(नोट: इसी तरह की चुनौती पहले जनवरी में पोस्ट की गई थी। हालांकि, मुझे लगता है कि इस अलग चुनौती को सही ठहराने के लिए दो कार्य पर्याप्त रूप से अलग-अलग हैं। इसके अलावा, मैंने केवल नीचे सब कुछ टाइप करने के बाद दूसरे सूत्र पर ध्यान दिया है, और मैं बल्कि करूँगा। बस इसे दूर नहीं फेंक दो।)
इनपुट:
इनपुट से मिलकर एक वैध इन्फ़िक्स अंकगणितीय अभिव्यक्ति के होते संख्या (गैर नकारात्मक पूर्णांक एक या अधिक दशमलव अंक के दृश्यों के रूप में प्रतिनिधित्व), संतुलित कोष्ठकों एक समूहीकृत उपसूचक इंगित करने के लिए, और चार इन्फ़िक्स द्विआधारी ऑपरेटरों + , -, *और /। अंतरिक्ष वर्णों की एक अनियंत्रित संख्या द्वारा इनमें से किसी को अलग किया जा सकता है (और संपूर्ण अभिव्यक्ति को घेर लिया गया है), जिसे अनदेखा किया जाना चाहिए। 1
औपचारिक व्याकरण पसंद करने वालों के लिए, यहाँ एक साधारण बीएनएफ-जैसा व्याकरण है जो वैध इनपुट को परिभाषित करता है। संक्षिप्तता और स्पष्टता के लिए, व्याकरण में वैकल्पिक स्थान शामिल नहीं हैं, जो कि किसी भी दो टोकन (संख्या के भीतर अंकों के अलावा) के बीच हो सकते हैं:
expression := number | subexpression | expression operator expression
subexpression := "(" expression ")"
operator := "+" | "-" | "*" | "/"
number := digit | digit number
digit := "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
1 एकमात्र मामला जहां रिक्त स्थान की उपस्थिति पार्सिंग को प्रभावित कर सकती है, जब वे दो लगातार संख्याओं को अलग करते हैं; हालाँकि, चूंकि ऑपरेटर द्वारा अलग किए गए दो नंबर एक वैध इनफ़िक्स एक्सप्रेशन में नहीं हो सकते, इसलिए यह मामला वैध इनपुट में कभी नहीं हो सकता है।
आउटपुट:
आउटपुट इनपुट के बराबर एक पोस्टफिक्स एक्सप्रेशन होना चाहिए। उत्पादन अभिव्यक्ति, साथ ही नंबर और ऑपरेटरों से मिलकर चाहिए एक भी अंतरिक्ष चरित्र आसन्न टोकन के प्रत्येक जोड़ी के बीच, निम्नलिखित व्याकरण (जो के रूप में करता है रिक्त स्थान शामिल हैं) 2 :
expression := number | expression sp expression sp operator
operator := "+" | "-" | "*" | "/"
number := digit | digit number
digit := "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
sp := " "
2 सादगी के लिए फिर से, numberइस व्याकरण में उत्पादन प्रमुख शून्य के साथ संख्याओं को स्वीकार करता है, भले ही वे नीचे के नियमों द्वारा आउटपुट में निषिद्ध हैं।
संचालक वरीयता:
कोष्ठक की अनुपस्थिति में, निम्नलिखित पूर्ववर्ती नियम लागू होते हैं:
- ऑपरेटरों
*और की/तुलना में उच्च वरीयता है+और-। - ऑपरेटरों
*और/एक दूसरे के लिए समान मिसाल है। - ऑपरेटरों
+और-एक दूसरे के लिए समान मिसाल है। - सभी ऑपरेटर बाएं सहयोगी हैं।
उदाहरण के लिए, निम्नलिखित दो भाव समतुल्य हैं:
1 + 2 / 3 * 4 - 5 + 6 * 7
((1 + ((2 / 3) * 4)) - 5) + (6 * 7)
और उन्हें निम्नलिखित उत्पादन प्राप्त करना चाहिए:
1 2 3 / 4 * + 5 - 6 7 * +
(ये सी भाषा के रूप में और सबसे से व्युत्पन्न भाषाओं में एक ही पूर्वता नियम हैं। वे शायद, नियमों आप प्राथमिक स्कूल में सिखाया जाता था जैसे लगते हैं के रिश्तेदार पूर्वता के लिए संभवतः सिवाय *और /।)
विविध नियम:
यदि दिया गया समाधान एक अभिव्यक्ति या सबरूटिन है, तो इनपुट की आपूर्ति की जानी चाहिए और आउटपुट एक स्ट्रिंग के रूप में वापस आ जाता है। यदि समाधान एक पूर्ण कार्यक्रम है, तो इसे मानक इनपुट से इनफ़िक्स एक्सप्रेशन वाली एक पंक्ति को पढ़ना चाहिए और मानक आउटपुट के लिए पोस्टफ़िक्स संस्करण वाले लाइन को प्रिंट करना चाहिए।
इनपुट में संख्याओं में अग्रणी शून्य शामिल हो सकते हैं। आउटपुट में संख्याओं में अग्रणी शून्य नहीं होना चाहिए (संख्या 0 को छोड़कर, जो आउटपुट के रूप में होगा
0)।आपसे किसी भी तरह से अभिव्यक्ति का मूल्यांकन या अनुकूलन करने की उम्मीद नहीं की जाती है। विशेष रूप से, आपको यह नहीं समझना चाहिए कि ऑपरेटर आवश्यक रूप से किसी भी साहचर्य, कम्यूटेटिव या अन्य बीजीय पहचान को संतुष्ट करते हैं। यही है, आपको यह नहीं मान लेना चाहिए कि उदाहरण
1 + 2बराबर है2 + 1या कि1 + (2 + 3)बराबर है(1 + 2) + 3।आप मान सकते हैं कि इनपुट में संख्या 2 31 - 1 = 2147483647 से अधिक नहीं है ।
इन नियमों का उद्देश्य यह सुनिश्चित करना है कि इनपुट द्वारा सही आउटपुट विशिष्ट रूप से परिभाषित किया गया है।
उदाहरण:
यहाँ कुछ मान्य इनपुट अभिव्यक्तियाँ और संबंधित आउटपुट दिए गए हैं "input" -> "output":
"1" -> "1"
"1 + 2" -> "1 2 +"
" 001 + 02 " -> "1 2 +"
"(((((1))) + (2)))" -> "1 2 +"
"1+2" -> "1 2 +"
"1 + 2 + 3" -> "1 2 + 3 +"
"1 + (2 + 3)" -> "1 2 3 + +"
"1 + 2 * 3" -> "1 2 3 * +"
"1 / 2 * 3" -> "1 2 / 3 *"
"0102 + 0000" -> "102 0 +"
"0-1+(2-3)*4-5*(6-(7+8)/9+10)" -> "0 1 - 2 3 - 4 * + 5 6 7 8 + 9 / - 10 + * -"
(कम से कम, मुझे आशा है कि ये सभी सही हैं; मैंने हाथ से रूपांतरण किया था, इसलिए गलतियों में कमी हो सकती है।)
बस स्पष्ट होने के लिए, निम्नलिखित इनपुट सभी अमान्य हैं; इससे कोई फर्क नहीं पड़ता है कि अगर आपका समाधान उन्हें दिया जाता है, तो (हालांकि, उदाहरण के लिए, त्रुटि संदेश लौटा देना, किसी स्मृति की अनंत राशि की तुलना में अच्छा है)
""
"x"
"1 2"
"1 + + 2"
"-1"
"3.141592653589793"
"10,000,000,001"
"(1 + 2"
"(1 + 2)) * (3 / (4)"
1 2 3 4 + *?
1 2 3 4 +`1 + 2 + 3 + 4`।