हास्केल , 74 67 63 बाइट्स
r=read
f x|(a,(c,s:d):_)<-lex<$>lex x!!0=show(r a*r d+r c)++s:d
इसे ऑनलाइन आज़माएं!
व्याख्या
जैसा कि H.PWiz को पता चला है कि हम यहां हास्केल के लेसर का उपयोग कर सकते हैं ताकि स्ट्रिंग को भागों में विभाजित किया जा सके। (पहले मैं उपयोग कर रहा था span(>'/')) और लिकोनी ने बताया कि <$>जैसे काम करता mapSndहैData.Tuple ।
पैटर्न गार्ड हमारे कोड को उन तीन नंबरों में तोड़ देता है जिनका हम उपयोग करना चाहते हैं lex। lexपहले टोकन को तोड़ने के लिए हॉकेल के लेक्सर को आमंत्रित करता है। यह स्ट्रिंग को पार्स करने के संभावित तरीके का प्रतिनिधित्व करने वाले प्रत्येक तत्व के साथ एक सूची देता है। ये तत्व पहले तत्व के साथ ट्यूपल हैं और पहला स्ट्रिंग है और बाकी स्ट्रिंग दूसरा तत्व है। अब चूंकि इनपुट प्रारूप बहुत ही नियमित है, हम केवल कभी-कभी केवल एक ही पार्स करते हैं, इसलिए हम हमेशा पहले एक ले सकते हैं। पहली चीज जो हम करते हैं lexवह इनपुट पर है
lex x
फिर हम इसे उस सूची से खोल देते हैं जो हमें 2-ट्यूपल देती है
lex x!!0
पहला टोकन मिश्रित अंश का पूरा हिस्सा होगा जो कि अभी भी पार्स करने के लिए एक स्थान द्वारा पूर्वनिर्मित अंश को छोड़ देगा। तब से टुपल्स Functorsहम (<$>)एक उपनाम का उपयोग कर सकते हैं टुपल के दूसरे तत्व fmapपर लागू होते हैं lex।
lex<$>lex x!!0
यह अंतरिक्ष के माध्यम से खाता है और अगले टोकन को तोड़ता है, हमारे अंश का अंश। अब हम इसका उपयोग करते हुए एक पैटर्न मैच के लिए बाध्य करते हैं <-। हमारा पैटर्न है
(a,(c,s:d):_)
aअंश का पूरा भाग पकड़ लेता है, हमारा पहला टोकन। :_हमारे दूसरे से उत्पन्न सूची को हटाता है lex। cदूसरे टोकन को हमने लेक्स किया, जो कि अंश का अंश है। जो कुछ भी शेष है s:dवह उसके पहले चरित्र में विभाजित हो जाता है, प्रारूप द्वारा गारंटी दी जाती है/ कि शेष और जो कि हर होगा।
अब जब हमने उस इनपुट को पार्स किया है जो हम वास्तविक गणना करते हैं:
show(r a*r d+r c)++s:d
rपढ़ा हुआ कार्य हम पहले कहां से करते हैं।
यह नोट करना महत्वपूर्ण है कि lexयदि कोई सूची विफल हो जाती है तो वह खाली हो जाती है और यदि वह सफल नहीं होती है तो गैर-रिक्त होती है। यह Maybeमैं क्यों नहीं जानता।