तो मैं सी # में "पासा अभिव्यक्ति" का विश्लेषण और मूल्यांकन करने में सक्षम होना चाहता हूं। एक पासा अभिव्यक्ति को इस तरह परिभाषित किया गया है:सी # में पार्सिंग पासा अभिव्यक्ति (उदाहरण के लिए 3 डी 6 + 5): कहां से शुरू करें?
<expr> := <expr> + <expr>
| <expr> - <expr>
| [<number>]d(<number>|%)
| <number>
<number> := positive integer
तो उदा। d6+20-2d3
की अनुमति दी जाएगी, और जैसा कि
rand.Next(1, 7) + 20 - (rand.Next(1, 4) + rand.Next(1, 4))
इसके अलावा d%
d100
के बराबर होना चाहिए मूल्यांकन करना चाहिए।
मैं जानता हूँ कि मैं एक साथ कुछ समाधान हैक कर सकता है, लेकिन मैं यह भी जानता हूँ कि यह एक बहुत ही विशिष्ट कंप्यूटर विज्ञान प्रकार समस्या की तरह लगता है, इसलिए कुछ सुपर सुरुचिपूर्ण समाधान मैं इस पर गौर करना चाहिए होना चाहिए।
मैं अपने पार्स का परिणाम चाहते हैं तो इन क्षमताओं:
- मैं अभिव्यक्ति का एक सामान्यीकृत रूप उत्पादन में सक्षम होना चाहिए; मैं पहले पासा सोच रहा हूं, पासा आकार द्वारा क्रमबद्ध, और हमेशा एक उपसर्ग के साथ। तो उदा। उपरोक्त नमूना
1d6-2d3+20
बन जाएगा। इसके अलावाd%
के किसी भी उदाहरण सामान्यीकृत रूप मेंd100
बन जाएगा। - मैं, पर-इच्छा की अभिव्यक्ति का मूल्यांकन करने के विभिन्न यादृच्छिक संख्या हर बार रोलिंग सक्षम होना चाहिए।
- मैं, इसलिए जैसे पासा रोल अधिकतम के सभी के साथ अभिव्यक्ति का मूल्यांकन करने में सक्षम होना चाहिए उपरोक्त नमूना (निर्धारक रूप से)
1*6+20+2*3 = 32
देगा।
मुझे पता है कि यह वास्तव में हास्केल की चीज़ है, और शायद अन्य कार्यात्मक-प्रकार की भाषाएं बहुत अच्छी होंगी, लेकिन यदि संभव हो तो मैं सी # में रहना चाहूंगा।
मेरे शुरुआती विचार रिकर्सन, सूचियों और शायद कुछ LINQ की ओर रुख करते हैं, लेकिन फिर भी, अगर मैंने कुछ लोगों के बारे में कुछ संकेत दिए बिना कोशिश की, तो मुझे यकीन है कि यह एक अजीब गड़बड़ हो जाएगा।
एक और रणनीति जो काम कर सकती है, कुछ प्रारंभिक रेगेक्स-आधारित स्ट्रिंग-प्रतिस्थापन होगा जो पासा अभिव्यक्ति को rand.Next
कॉलों में बदलने के लिए, और फिर ऑन-द-फ्लाई मूल्यांकन या संकलन ... क्या यह वास्तव में काम करेगा? मैं हर बार एक नया rand
ऑब्जेक्ट बनाने से कैसे बच सकता हूं?
random.Next की पहली पैरामीटर समावेशी है, और यह दूसरा पैरामीटर अनन्य है। http://msdn.microsoft.com/en-us/library/2dx6wyd4%28VS.95%29.aspx – Domenic
पर्याप्त मेला :) – annakata
मुझे लगता है कि आपका मतलब है: rand.Next (1, 7) + 20 - (रैंड। अगला (1, 4) + रैंड। अगला (1, 4)) –