एक सर्वव्यापी कैलकुलेटर बनाएँ


16

प्रेरणा स्त्रोत। श्लोक में।

किसी दिए गए सर्वव्यापी अभिव्यक्ति का मूल्यांकन करें।

ओम्निफ़िक्स सामान्य गणित की इन्फिक्स अंकन की तरह है, लेकिन तर्कों के आसपास के प्रत्येक प्रतीक की अतिरिक्त प्रतियां हैं। बाहरी प्रतीकों कोष्ठक की जगह लेते हैं, और इसलिए अतिरिक्त कोष्ठकों की कोई आवश्यकता नहीं है।

आपको -0-n-अपनी भाषा के लिए उचित सीमा के भीतर जोड़, घटाव, गुणा, भाग और सकारात्मक वास्तविक संख्या (नकारात्मक लिखी जा सकती है ) का समर्थन करना चाहिए ।

प्लस और माइनस होना चाहिए +और -, लेकिन आप का उपयोग *या ×बार /या ÷विभाजन के लिए कर सकते हैं। अन्य उचित प्रतीकों के अनुरोध पर अनुमति दी जाएगी।

ब्राउनी स्पष्टीकरण और अतिरिक्त सुविधाओं (जैसे अतिरिक्त संचालन, नकारात्मक संख्या, तार आदि) के लिए इंगित करता है, भले ही आपके उत्तर में ये विशेषताएं न हों, यह दिखाने के लिए स्वतंत्र महसूस करें कि यह कैसे हो सकता है।

यदि संभव हो तो अपने समाधान का परीक्षण करने के लिए एक लिंक प्रदान करें।

उदाहरण

स्पष्टता के लिए, नीचे दिए गए स्पष्टीकरण ¯नकारात्मक संख्याओं को इंगित करने के लिए उच्च माइनस ( ) का उपयोग करते हैं । आप किसी भी उचित प्रारूप का उपयोग करके नकारात्मक संख्या लौटा सकते हैं।

-5-2-3

+2+×3×2×+8 ( +2+×3×2×++2+6+8)

-14--3-1--12 ( -4--3-1---14-2-12)

+2.1+×3.5×2.2×+9.8 ( +2.1+×3.5×2.2×++2.1+7.7+9.8)

×3×÷-0-6-÷2÷×-9 ( ×3×÷-0-6-÷2÷××3×÷¯6÷2÷××3ׯ3ׯ9)

÷4÷-3-÷1÷2÷-÷1.6 ( ÷4÷-3-÷1÷2÷-÷÷4÷-3-0.5-÷÷4÷2.5÷1.6)


1
The explanations below use high minus (`¯`) to indicate negative numbers.आप निश्चित रूप से एपीएल से प्यार करते हैं।
निकोल आउटफोलर जूल

@EriktheOutgolfer आपके पास एक बेहतर सुझाव है? इसके अलावा, TI-BASIC उच्च माइनस का उपयोग करता है।
Adám

वास्तव में नहीं है क्योंकि -s को s के साथ भ्रमित किया जा सकता है -जबकि ¯s को s के साथ भ्रमित नहीं किया जा सकता है -
निकोलग्राफ जूल

बाह, मैंने सिर्फ वास्तविक संख्या की आवश्यकता पर ध्यान दिया। मेरे 290-बाइट पूर्णांक अंकगणितीय रेटिना समाधान के लिए इतना ...
नील

@ उत्तर आप इसे उत्तर के रूप में क्यों नहीं पोस्ट करते हैं?
एडम जूल

जवाबों:


4

सी # (.NET कोर) , 198 197 188 बाइट्स

float O(string s){try{return float.Parse(s);}catch{var f=s[0];int i=s.IndexOf(f,1);float a=O(s.Substring(1,i-1)),b=O(s.Substring(i+1,s.Length-i-2));return f<43?a*b:f<44?a+b:f<46?a-b:a/b;}}

इसे ऑनलाइन आज़माएं!

उपयोग *और /

एक पुनरावर्ती कार्य। यह पहली बार इनपुट स्ट्रिंग को पार्स करने की कोशिश करता है float। यदि यह विफल हो जाता है, तो यह अपने आप को पहले और दूसरे ऑपरेंड के तर्क के रूप में उत्तीर्ण कहता है और फिर परिणामों पर चयनित ऑपरेशन करता है।

  • 1 बाइट श्री Xcoder के लिए धन्यवाद बचाया!
  • 9 बाइट्स ने TheLethalCoder को धन्यवाद दिया!

IndefOf(f, 1)हो सकता हैIndexOf(f,1)
मिस्टर एक्सकोडर

1
उपयोग floatरों बजाय, चार कोड का उपयोग, आप जब उन्हें शायद के साथ उन्हें छोटा कर सकते हैं >और <स्थानों के एक जोड़े में।
द लीथलकोडर

आप एक बाइट को बदल i+1,s.Length-i-2सकते हैं ++i,s.Length+~i
केविन क्रूज़सेन

4

पायथन 3, 159 158 152 144 136 135 132 बाइट्स

def t(i,a=1):
 while'-'<l[i]!='/':i+=1;a=0
 if a:l[i]='(';i=t(t(i+1));l[i-1]=')'
 return-~i
*l,=input()
t(0)
print(eval(''.join(l)))

इसे ऑनलाइन आज़माएं!

नकारात्मक संख्या (हालांकि -0-5-काम करता है) की अनुमति नहीं देता है और अजगर ऑपरेटरों की आवश्यकता है।


क्या आप TIO लिंक जोड़ सकते हैं?
एडम जूल

1
while~-(l[i]in'+-*/'):i+=1;a=1और *l,=input()152 बाइट्स के लिए
फेलिप नारदी बतिस्ता

1
सभी परीक्षण मामलों के साथ: लिंक
फेलिप नारदी बतिस्ता


1
if a:l[i]='(';i=t(t(i+1));l[i-1]=')'के साथ return-~i135 बाइट्स के लिए: पी
फेलिप नारदी बतिस्ता

3

रेटिना , 290 287 286 बाइट्स

\d+
¦$&$*
¯¦
¯
{`\+([¯¦]1*)\+([¯¦]1*)\+
-$1-¯$2-
-(¯|¦)(1*)-([¯¦]+1*\2)-
-¯$3-¯$1$2-
(×|÷)¯(1*\1)([¯¦]1*\1)
$1¦$2¯$3
צ×[¯¦]1*×|¯¯¦?
¦
¯¦|¦¯
¯
+`-((¯|¦)1*)(1*)-\2\3-
$1
-([¯¦]1*)-[¯¦](1*)-
$1$2
צ1(1*)×([¯¦]1*)×
+צ$1×$2×+$2+
}`÷¦(?=1*÷(¯|¦)(1+)÷)(\2)*1*÷\1\2÷
$1$#3$*
((¯)|¦)(1*)
$2$.3

इसे ऑनलाइन आज़माएं! नोट: केवल पूर्णांक अंकगणित करने में सक्षम है, इसलिए कुछ परीक्षण मामलों को हटा दिया गया है। ¯उपसर्ग का उपयोग करके नकारात्मक संख्याओं को स्वीकार और वापस करता है । संपादित करें: @Cowsquack के लिए 3 4 बाइट्स सहेजे गए। स्पष्टीकरण:

\d+
¦$&$*

मुझे शून्य से निपटने के कुछ तरीके की आवश्यकता थी, इसलिए मैं ¦एक सकारात्मक संख्या उपसर्ग के रूप में उपयोग करता हूं । फिर संख्याओं को एकात्मक में बदल दिया जाता है।

¯¦
¯

लेकिन नकारात्मक संख्याओं को केवल एक ¯उपसर्ग की आवश्यकता होती है ।

{`\+([¯¦]1*)\+([¯¦]1*)\+
-$1-¯$2-

उद्धृत करना +बदसूरत हो जाता है, इसलिए मैं परिवर्धन को घटाव में बदल देता हूं।

-(¯|¦)(1*)-([¯¦]+1*\2)-
-¯$3-¯$1$2-

यदि घटाव के एलएचएस का निरपेक्ष मान आरएचएस से कम है, तो उन्हें चारों ओर घुमाएं और दोनों पक्षों को नकार दें।

(×|÷)¯(1*\1)([¯¦]1*\1)
$1¦$2¯$3

इसके अलावा अगर गुणा या भाग का LHS नकारात्मक है, तो दोनों पक्षों को नकारें।

צ×[¯¦]1*×|¯¯¦?
¦

इसके अलावा यदि एलएचएस का गुणन शून्य है, तो परिणाम शून्य है। इसके अलावा, दो minuses एक प्लस बनाते हैं।

¯¦|¦¯
¯

लेकिन एक माइनस और एक प्लस (या इसके विपरीत) एक माइनस बनाते हैं।

+`-((¯|¦)1*)(1*)-\2\3-
$1

एक ही संकेत के दो नंबरों को घटाएं। ऐसा तब तक बार-बार करें जब तक कि इस तरह का कोई घटाव बाकी न रह जाए।

-([¯¦]1*)-[¯¦](1*)-
$1$2

यदि अभी भी घटाव है, तो संकेत अलग-अलग होने चाहिए, इसलिए संख्याओं को एक साथ जोड़ें। (लेकिन केवल एक बार ऐसा करें, क्योंकि यह एक ही संकेत के दो संख्याओं के घटाव को फिर से प्रकट कर सकता है।)

צ1(1*)×([¯¦]1*)×
+צ$1×$2×+$2+

बार-बार जोड़कर गुणा करें।

}`÷¦(?=1*÷(¯|¦)(1+)÷)(\2)*1*÷\1\2÷
$1$#3$*

पूर्णांक विभाजन करें। उपरोक्त चरणों में से एक ने अभिव्यक्ति को सरल बनाया होगा, इसलिए जब तक कोई ऑपरेशन नहीं बचा है, तब तक लूप बैक करें।

((¯)|¦)(1*)
$2$.3

वापस दशमलव में परिवर्तित करें।


वाह, वह है - महाकाव्य। PPCG पर सबसे बड़ा रेटिना पद? हालांकि, आमतौर पर QuadR और रेटिना सॉल्यूशंस एक-दूसरे के काफी करीब होते हैं। क्या मैं प्रेरित कर सकता हूं?
एडम जूल

इस पंक्ति में +`-(([¯¦])1*)(1*)-\2\3-, [¯¦]बन सकते हैं¯|¦
क्रिति लिथोस

@ कॉक्सैक वास्तव में तीन बार होता है, धन्यवाद!
नील

वहाँ एक याद किया है ([×÷]);)
Kritii Lithos

1
@Cowsquack आप बेहतर एक और एक नहीं मिलेगा, अन्यथा मैं 4 को पार करना होगा ...
नील

2

PHP , 116 114 109 बाइट्स

-5 मार्टिन एंडर को धन्यवाद

for($s=$argv[$o=1];$o!=$s;)$s=preg_replace('#([*+/-])(([\d.]+|(?R))\1(?3))\1#','($2)',$o=$s);eval("echo$s;");

*गुणा और /विभाजन के लिए उपयोग करता है । मेरे होने के बावजूद कोई विशेष प्रयास न करने के बावजूद नकारात्मक संख्याएँ काम करती हैं।

इसे ऑनलाइन आज़माएं!

अनगढ़ और समझाया हुआ

for($s=$argv[$o=1];   # Initialize with $s = input and $o = 1;
    $o!=$s;)          # While $o != $s
    # Set $o to $s and set $s to be $s after this regex replacement:
    $s=preg_replace('#([*+/-])(([\d.]+|(?R))\1(?3))\1#','($2)',$o=$s);
    # i.e., continue to do this replacement until the result is the same on two consecutive
    # steps (no replacement was made)
# Once $o == $s (i.e. no more replacement can be made), eval the result and print
eval("echo$s;"); 

मैं regex भी समझाता हूँ क्योंकि यह थोड़ा जादुई है:

([*+/-])(([\d.]+|(?R))\1(?3))\1


([*+/-])

सबसे पहले, हम चार ऑपरेटरों में से किसी से मेल खाना चाहते हैं: *+/-

([\d.]+|(?R))

फिर, हमें किसी संख्या [\d.]+या किसी अन्य मान्य सर्वव्यापी अभिव्यक्ति से मेल खाना चाहिए (?R)

\1

फिर, हम उसी ऑपरेटर से मेल खाते हैं जो शुरुआत में था।

(?3)

फिर हम वही काम करते हैं जो हमने समूह 3 में किया था: एक संख्या या एक सर्वव्यापी अभिव्यक्ति से मेल खाते हैं।

\1

अंत में, प्रारंभिक ऑपरेटर से फिर से मिलान करें।

इसके साथ जो भी मैच होते हैं उन्हें बदल दिया जाता है ($2)। यह आसपास के ऑपरेटरों के अंदर भाग लेता है और इसे कोष्ठक के अंदर रखता है, इसलिए यह सामान्य इन्फिक्स नोटेशन जैसा दिखता है।


2

QuadR , 33 32 27 बाइट्स

-1 गायों को धन्यवाद । -5 एरिक आउटग्लोफर के लिए धन्यवाद ।

((.)[\d¯\.]+){2}\2
⍎¯11↓⍵M

तर्क / झंडे के साथ

इसे ऑनलाइन आज़माएं!

यह 40-बाइट Dyalog APL समाधान के बराबर है:

'((.)[\d¯\.]+){2}\2'R{⍕⍎1↓¯1↓⍵.Match}⍣≡

इसे ऑनलाइन आज़माएं!

व्याख्या

(कोष्ठक पाठ का अर्थ क्वाडआर के बजाय डायलाग एपीएल से है)

(... ){2}\2 निम्नलिखित पैटर्न दो बार, और पूरे मैच दो बार भी:
  (.) किसी भी चरित्र
  [... वर्णों ]+ के निम्नलिखित सेट में से एक या एक से अधिक के बाद:
   \dडी igits,
   ¯ उच्च ऋण (नकारात्मक संकेत)
   \. अवधि

( ⎕R है आर के साथ eplaced :)

( {} नाम स्थान पर लागू निम्नलिखित अनाम फ़ंक्शन का परिणाम of :)

⍵M ( ⍵.Match) M atch का पाठ
¯1↓ अंतिम वर्ण (प्रतीक + - ×या ÷)
1↓ ड्रॉप को पहले वर्ण (प्रतीक)
 को APL कोड
 (  stringify) के रूप में निष्पादित करता है।

 ( ⍣≡) रिप्लेसमेंट को तब तक दोहराएं जब तक कि ज्यादा बदलाव न हो जाएं


मुझे लगता है कि आप ड्रॉप कर सकते हैं
क्रिक्टी लिथोस

@Cowsquack आप QuadR के बारे में सही हैं। ⎕Rसंख्यात्मक डेटा पर काम नहीं कर सकता। धन्यवाद।
एडम जूल


1

हास्केल , 132 चार

(134 बाइट्स, क्योंकि ×और ÷UTF-8 में दो बाइट्स लेते हैं)

f y|(n@(_:_),r)<-span(`elem`['.'..'9'])y=(read n,r)
f(c:d)|(l,_:s)<-f d,(m,_:r)<-f s=(o[c]l m,r)
o"+"=(+)
o"-"=(-)
o"×"=(*)
o"÷"=(/)

इसे ऑनलाइन आज़माएं!

fयह जितना इनपुट कर सकता है उतना ही परसेंटेज देता है और रिजल्ट के साथ-साथ बचे हुए स्ट्रिंग (जो टेस्ट केसेस में खाली होता है) देता है। यदि यह नियम-अनुरूप नहीं है, तो अप्राप्य शेष स्ट्रिंग के साथ पट्टी करें

हास्केल , 139 वर्ण

...
g=fst.f

0

पर्ल, 64 53 बाइट्स

शामिल +1के लिए-p

perl -pe 's%([*-/])(([\d.]+|(?0))\1(?3))\1%($2)%&&redo;$_=eval' <<< "/4/-3-/1/2/-/"

आकस्मिक रूप से भी लागू होता है ,(पहले तर्क को दूर फेंकता है) और कभी-कभी .(एक साथ तर्कों को जोड़ते हैं)। .यह बहुत विश्वसनीय काम नहीं करता है, क्योंकि यह दशमलव बिंदु पर पार्सिंग स्तर और मूल्यांकन स्तर दोनों में हस्तक्षेप करता है


0

जावा 8, 205 200 बाइट्स

float O(String s){try{return new Float(s);}catch(Exception e){int f=s.charAt(0),i=s.indexOf(f,1);float a=O(s.substring(1,i)),b=O(s.substring(i+1,s.length()-1));return f<43?a*b:f<44?a+b:f<46?a-b:a/b;}}

पोर्ट ऑफ @ क्रिसली सी # उत्तर
-5 बाइट्स @ceilingcat की बदौलत

इसे ऑनलाइन आज़माएं।

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