हास्केल , 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
मैं क्यों नहीं जानता।