वैकल्पिक पक्षों से एक गणितीय अभिव्यक्ति को हल करें


9

एक प्रोग्राम बनाएं जो अभिव्यक्ति के वैकल्पिक पक्षों से तत्वों का उपयोग करके गणितीय अभिव्यक्ति को हल करता है। जिस तरह से यह किया गया है, बाएं से दाएं पढ़ने के बजाय, आप पहले वर्ण, फिर अंतिम, फिर दूसरा, फिर दूसरा से अंतिम आदि पढ़ते हैं। इससे आपको एक नई अभिव्यक्ति मिलेगी जिसका आपको मूल्यांकन और आउटपुट करना होगा।

a*b/c+d-e
135798642  <-- Order you read the expression in
ae*-bd/+c  <-- Order of operation. 

उदाहरण:

1*3/2+4-5
15*-34/+2 = -255

यदि अभिव्यक्ति «काम» नहीं करती है, 1तो उसे काम करने के लिए आवश्यक पदों पर डाला जाना चाहिए।

कुछ उदाहरण शायद इसे बेहतर रूप में चित्रित करेंगे:

Input: 1+1+1+1+1
Result: 23     // Because 1+1+1+1+1 -> 11++11++1 -> 23

Input: 1+2-3+12-5
Result: -19    // Because 1+2-3+12-5 -> 15+-22-13+ -> 15+-22-13+1 -> -19
               //                                 |
               //                                 Not valid expression

Input: 2*2*2*2*2
Result: 968    // Because 2*2*2*2*2 -> 22**22**2 -> 22*1*22*1*2 -> 968
               //                        ||  ||
               //                        Not valid, 1 must be inserted

Input: 17/2
Output: 127    // Because 17/2 = 127/ -> 127/1 -> 127

जिन ऑपरेटरों का समर्थन किया जाना चाहिए, वे हैं + - * /। कोष्ठक नहीं होंगे। सामान्य गणित नियम और "सिंटैक्स" का उपयोग किया जाता है, इसलिए उदाहरण के लिए **घातांक का अर्थ नहीं है। (यानी MATLAB शैली के a++++1बराबर है a+1, C ++ नहीं)।

मामले में कोई संदेह नहीं है, कुछ वैध संचालन हैं:

-a
+a
a++b
a+-b
a*-b
a*+b
a*++b
a/b
a/-b
a/+b
-a/--b

जबकि निम्नलिखित सभी मान्य नहीं हैं। यह दिखाया गया है कि उन्हें किस चीज़ के साथ प्रतिस्थापित किया जाना चाहिए:

a+      | a+1
a-      | a-1
a++++   | a++++1   (This is equivalent to a+1)
a*+++   | a*+++1   (This is equivalent to a*1)
a**b    | a*1*b
a*/b    | a*1/b
a/*b    | a/1*b
a*      | a*1
*a      | 1*a
***a    | 1*1*1*a

नियम:

  • कोड एक फ़ंक्शन या पूर्ण प्रोग्राम हो सकता है
  • इनपुट STDIN या फ़ंक्शन तर्क हो सकता है
  • इनपुट एक मान्य गणितीय अभिव्यक्ति होना चाहिए, उद्धरण चिह्नों के बिना, ''या""
  • आउटपुट पूर्णांक, दशमलव या सरलीकृत अंश के रूप में नई अभिव्यक्ति का उत्तर होना चाहिए।
  • दशमलव बिंदु के बाद कम से कम तीन अंक का समर्थन किया जाना चाहिए। तो 1/3 = 0.333, नहीं 0.330.333333333स्वीकार कर लिया है।
  • ans = ... स्वीकार कर लिया है।
  • लीडिंग और अनुगामी newlines और रिक्त स्थान स्वीकार किए जाते हैं।
  • इनपुट केवल पूर्णांक होगा
  • शून्य से डिवीजन के परिणामस्वरूप त्रुटि हो सकती है, NaN, Inf आदि किसी संख्या को आउटपुट करना स्वीकार नहीं किया जाता है।

हमेशा की तरह, बाइट्स में सबसे छोटा कोड जीत जाता है। चुनौती पोस्ट किए जाने के दिन से एक सप्ताह में एक विजेता का चयन किया जाएगा। बाद में पोस्ट किए गए उत्तर अभी भी जीत सकते हैं यदि यह वर्तमान नेता से छोटा है।


क्या इनपुट स्ट्रिंग या ऑपरेटरों / पूर्णांक इनपुट की गिनती पर अधिकतम लंबाई है? भी, क्या मुझे गणित का समर्थन करना है 2^64, और क्या यह त्रुटि या लपेटना चाहिए यदि आप ऊपर जाते हैं?
बिल्ली

"आउटपुट का उत्तर होना चाहिए [।] सरलीकृत अंश ..." तो क्या मैं वापस आ सकता हूं 0/0यदि अभिव्यक्ति पूर्णांक विभाजन या मोडुलो को शून्य से निकालता है?
बिल्ली

2
यदि उत्तर शून्य से विभाजन देता है, तो x/0एक वैध आउटपुट है। जब तक यह गलत उत्तर नहीं देता है, तब तक यह ठीक नहीं है। त्रुटि और "एक संख्या नहीं" परिभाषा सही है, और अनंत "सही पर्याप्त" है,
स्टीवी ग्रिफिन

बस सुनिश्चित करने के लिए - eval का उपयोग किया जा सकता है, है ना?
orlp

हाँ, eval ठीक है।
स्टू ग्रिफिन

जवाबों:


3

पर्ल, 108 100 बाइट्स

$_="";while(@F){$_.=shift@F;$_.=pop@F}s@(\*|/)\1+@\1@g;s@^[*/]@1$&@;s@\D$@$&1@;s@\D@$&@g;$_=eval

कोड 96 बाइट्स है, प्लस 4 कमांड-लाइन तर्क के लिए -pF//, जहां

  • -pआवेषण while (<>) { .. } continue { print }और
  • -F//इनपुट को विभाजित करता है और इसे अंदर डालता है @F

ध्यान दें कि इनपुट में अनुगामी नई रेखा नहीं होनी चाहिए, इसलिए उपयोग करें /bin/echo -n 'formula' | perl ...

कम गोल्फ वाला:

$_='';              # reset $_
while(@F) {         # reorder input
   $_.=shift @F;    # take first element off of @_
   $_.=pop @F       # idem for last; if @F is empty, undef is appended
}

s@(\*|/)\1+@\1@g;   # replace 2 or more '*' or '/' with just one: *1 and /1 = nop
s@^[*/]@1$&@;       # if expression starts with * or / prepend a 1
s@\D$@$&1@;         # if expression doesn't end with a number, append 1
s@\D@$& @g;         # eval doesn't like '++1': add spaces after operators
$_ = eval           # set $_ to 3v1l, so the `-p` will print the new value

परिक्षण

उपर्युक्त फ़ाइल में 114.pl, और नीचे दी गई परीक्षा स्क्रिप्ट को एक फ़ाइल में रखें:

%test = (
    '1+1+1+1+1' =>   23,
    '1*3/2+4-5' => -255,
    '1+2-3+12-5'=>  -19,
    '2*2*2*2*2' =>  968,
    '17/2'      =>  127,
    '--/-1-2-'  =>   -2,
    '**2*'      =>    2,
    '++1++'     =>    1,
    '/2/'       =>  0.5,
    '10/'       =>   '',
);

printf "%-20s -> %5s: %5s\n", $_, $test{$_}, `/bin/echo -n '$_' | perl -pF// 114.pl`
for keys %test;

इसे आउटपुट देना:

++1++                ->     1:     1
**2*                 ->     2:     2
17/2                 ->   127:   127
10/                  ->      :
1+1+1+1+1            ->    23:    23
1*3/2+4-5            ->  -255:  -255
2*2*2*2*2            ->   968:   968
1+2-3+12-5           ->   -19:   -19
--/-1-2-             ->    -2:    -2
/2/                  ->   0.5:   0.5

ध्यान दें कि 1/0शून्य त्रुटि से एक विभाजन का कारण बनता है: evalआउटपुट undef, जिसे खाली स्ट्रिंग द्वारा दर्शाया गया है।


कुछ और परीक्षण मामले! मैं उनका उपयोग करने जा रहा हूँ
edc65

3

जावास्क्रिप्ट ईएस 6, 105 106

सहेजे गए 1 बाइट को संपादित करें

t=>eval("for(t=[...t],p=o='';c=t.reverse().pop();p=c)o+=p<'0'?(c=='/'|c<'+'||' ')+c:c;eval(p<'0'?o+1:o)")

// Less golfed
t=>{
  for(t = [...t], p = o = '';
      c = t.reverse().pop();
      p = c)
    o += p<'0' 
     ? (c=='/' | c=='*' || ' ')+c  // '1' or ' '
     : c;
  return eval(p<'0' ? o+1 : o)
}

टेस्ट स्निपेट

f=t=>eval("for(t=[...t],p=o='';c=t.reverse().pop();p=c)o+=p<'0'?(c=='/'|c<'+'||' ')+c:c;eval(p<'0'?o+1:o)")

console.log=x=>O.innerHTML+=x+'\n'

function test() { console.log(I.value + ' -> '+f(I.value)) }

;['1+1+1+1+1', '1*3/2+4-5', '1+2-3+12-5', '2*2*2*2*2',
  '17/2', '--/-1-2-', '**2*', '++1++', '/2/', '10/' ]
.forEach(t=>console.log(t+' -> '+f(t)))
Your test <input id=I><button onclick="test()">-></button>
<pre id=O></pre>


आप एक बाइट बचाया p < '0' ? ( c=='/' | c<'+' || ' ' )+c : c ;:।
केनी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.