बहुपद अभिव्यक्ति स्ट्रिंग का मूल्यांकन करें


18

एक फ़ंक्शन बनाएं जो एक बहुपद समीकरण, मान लेता है xऔर ऑपरेशन का परिणाम देता है।

उदाहरण: दिया 4x^2+2x-5और x=3आउटपुट 37। इसी का परिणाम है4(3)^2+2(3)-5

  • मान लें कि सभी बहुपद वैध हैं
  • बहुपद प्रारूप हमेशा coefficient(variable)^exponent => 4x^2छोड़कर होगा:
    • एक्सपोनेंट कब 1होगाcoefficient(variable) => 4x
    • जब गुणांक 1यह होगा(variable)^exponent => x^2
  • बहुपद केवल एक चर हैं
  • बाहरी पुस्तकालयों का उपयोग वर्जित है
  • गुणांक और चर इनपुट सकारात्मक और नकारात्मक संख्याएं हो सकती हैं।

परीक्षण के मामलों

  • ("3x^3-5x^2+2x-10", 5) => 250
  • ("10x^4-5x^3-10x^2+3x+50", 3) => 644
  • ("10x+20", 10) => 120
  • ("-20x^2+20x-50", -8) => -1490
  • ("9", 5) => 9
  • ("8x^2+5", 0) => 5

अपडेट करें

  • बहुपद प्रारूप हमेशा coefficient(variable)^exponent => 4x^2छोड़कर होगा:
    • एक्सपोनेंट कब 1होगाcoefficient(variable) => 4x
    • जब गुणांक 1यह होगा(variable)^exponent => x^2
  • नकारात्मक प्रतिपादक का नियम हटा दिया। मेरी गलती। एक वैध बहुपद में नकारात्मक घातांक नहीं होता है
  • का एक घातांक 0होगाcoefficient
  • के लिए परीक्षण मामला जोड़ा गया input 0

यह , इसलिए बाइट्स में सबसे कम उत्तर जीतते हैं।


3
इनपुट प्रारूप कितना लचीला है? इसके बजाय 3x^3-5x^2+2x-10हम इनपुट कर सकते हैं 3*x^3-5*x^2+2*x-10? या [3 -5 2 -10]. [3 2 1 0]?
लुइस मेंडो

1
@ अरनल्ड यस ...
लुइस फेलिप डी

4
एक "बाहरी पुस्तकालय" क्या है और यह कैसे निष्पक्ष है, उन भाषाओं की तुलना में जिनके पास "eval" पहले से ही एक सुविधा के रूप में लागू है?
ओलिवियर ग्रामेइयर

1
मेरी क्षमायाचना मैंने कल से अपने पीसी का उपयोग नहीं किया है। आपके द्वारा दिए गए सुझावों से मैंने चुनौती को अद्यतन किया है। कृपया इसे देखें और यदि सब कुछ ठीक है तो इसे फिर से खोलें।
लुइस फेलिप डी जीसस मुनोज

जवाबों:


12

जावास्क्रिप्ट (ईएस 7), 48 बाइट्स

@RickHitchcock से एक सुझाव के आधार पर

Xअपरकेस में उम्मीद है। करी सिंटैक्स में इनपुट लेता है (p)(X)

p=>X=>eval(p.replace(/[X^]/g,c=>c<{}?'*X':'**'))

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


जावास्क्रिप्ट (ईएस 7), 49 बाइट्स

@DeadPossum के समान दृष्टिकोण । करी सिंटैक्स में इनपुट लेता है (p)(x)

p=>x=>eval(p.split`x`.join`*x`.split`^`.join`**`)

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


1
मुझे लगता है कि आप कुछ बाइट्स का उपयोग करके बचा सकते हैं replace: p=>x=>eval(p.replace(/[x^]/g,a=>a>f?'*x':'**'))
रिक हिचकॉक

@RickHitchcock मैं एक संदर्भ का उपयोग नहीं कर सकता fजब तक कि इसे बाइट की गिनती में शामिल नहीं किया जाता है, 2 बाइट्स की कीमत पर जिन्हें बचाया जाना चाहिए। मुझे यह तरीका पसंद है, हालाँकि। बाइट को बचाने के लिए एक तरीका हो सकता है या दो को किसी तरह से सुधार कर।
अरनुलद

2
@RickHitchcock अगर हम Xअपरकेस में ले जा सकते हैं , तो हम a<{}?'*X':'**'एक बाइट की बचत कर सकते हैं । इसलिए ओपी से मेरा सवाल।
अरनुलद

1
xअकेले नहीं संभाल सकते
l4m2

1
@ l4m2 चुनौती नियम अद्यतन किए गए थे। : / यह हुआ करता था 1xके लिए x
अरनुलद


8

पायथन 3 , 53 50 48 बाइट्स

संपादित करें : डेनिस के लिए -5 बाइट्स धन्यवाद!

lambda p,x:eval(p.translate({94:"**",120:"*x"}))

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

कॉलिंग translateसे बचने के लिए उपयोग किया जाता है replace; पायथन 3 का संस्करण translateअपने पूर्ववर्ती की तुलना में कम अजीब नहीं है।


"*(%d)"%xबन सकता है "*(x)"
डेनिस

धन्यवाद, मुझे पता नहीं था कि घटना xमेरे evalदायरे में थी! मैं अपडेट करूंगा।
एथेन

1
दरअसल, चूंकि xअब कोई स्ट्रिंग प्रतिनिधित्व नहीं है , इसलिए भी यह "*x"काम करता है।
डेनिस

और भी बेहतर ! एक बार फिर धन्यवाद।
एटीन

5

आर , 44 बाइट्स

function(f,x)eval(parse(t=gsub("x","*x",f)))

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

काफी बदलें आर के साथ सीधा nxसाथ n*xऔर फिर घ स्ट्रिंग। इसका उपयोग इस प्रकार किया जाता है कि हम दूसरे तर्क का नाम कैसे दें।evalparsex

Eval समारोह भी साथ सही प्रारूप में पहला तर्क के साथ और अधिक सीधे इस्तेमाल किया जा सकता है, और अन्य औपचारिक तर्क ( y, zआदि) आसानी से जोड़ा जा सकता है:

आर , 20 बाइट्स (गैर-प्रतिस्पर्धात्मक)

function(f,x)eval(f)

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




3

जावास्क्रिप्ट (Node.js) , 113 108 बाइट्स

_=>x=>_.match(/-?(?:[x\d]+|\^?)+/g).reduce((a,b)=>b.split`x`[0]*(~b.indexOf`x`?x**(b.split`^`[1]||1):1)+a,0)

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

@Arnauld को धन्यवाद


चूंकि @Arnauld (49 बाइट्स) द्वारा अब तक का सबसे अच्छा जेएस समाधान पहले से ही पोस्ट किया गया है और इसका उपयोग करता है eval, मैंने रेक्स का उपयोग करने और इसके बजाय कम करने का फैसला किया।

हालांकि उसकी तुलना में बहुत लंबा है।

स्पष्टीकरण:

A =>                            // lambda function accepting argument 1 
    x =>                        // argument number 2 (currying syntax used)
        A.match(                // this matches all instance of what comes next 
                                // and converts to array
       /[-]?(?:[x\d]+|\^?)+/g)  // regexp for -ve sign , variable number and ^ sign 
            .reduce((a, b) =>   // reduce the array to single (take 2 params a,b)
                b.split `x`     // split b at instances of `x` 
                        [0]     // and select the first instance 
                * (b.indexOf`x` // multiply that by value of index of x in b 
                    > 0 ?       // if it is greater than 0 then 
                x **            // multiplication will be with x raised to power
               (l = b.split `^` // set variable split b at every `x` 
                   [1]||1       // choose first index otherwise set to one
                )               // this is what x is raised to the power 
                : 1)            // in the case x is not present multiply by 1
                + a,            //  add value of `a` to that value 
        0)                      // in case no reduce is possible set value to 0


यह वर्तमान में अंतिम परीक्षण मामले (0.25 होना चाहिए) पर विफल रहता है। आप का उपयोग करके कुछ बाइट्स बचा सकता है -के बजाय [-], ~b.indexOf`x` के बजाय b.indexOf`x`>0और हटाने l=जो नहीं किया जाता है। (लेकिन यह बग को ठीक नहीं करता है।)
अरनॉल्ड

@ अरनल्ड: धन्यवाद। नहीं पता कि ऐसा क्यों होता है, यह देखेंगे कि समस्या क्या है
मुहम्मद सलमान

ठीक है, समस्या यह है कि आपके रेगेक्स 1x^-2पर विभाजन होता है -
अरनुलद

3

05AB1E , 16 19 बाइट्स

„*(I')J'xs:'^„**:.E

नकारात्मक इनपुट के लिए बग-फिक्स के रूप में +3 बाइट्स x

.E@ अदनान की इस नवीनतम कमिट में रन ( बैच कोड के रूप में रन ) को पायथन के रूपeval में रन के साथ बदल दिया गया है , लेकिन यह संस्करण अभी तक लोकप्रिय नहीं है। @ Mr.Xcoder ने अपने स्थानीय (नवीनतम संस्करण) 05AB1E पर यह सत्यापित करने के लिए परीक्षण किया कि यह काम कर रहा है। इस संस्करण को बिना देखें कि यह अभिव्यक्ति स्ट्रिंग में कैसे परिवर्तित हुआ।
.E

स्पष्टीकरण:

„*I')J'xs:    # Replace all "x" with "*(n)" (where `n` is the input-integer)
              #  i.e. 5 and 3x^3-5x^2+2x-10 → 3*(5)^3-5*(5)^2-2*(5)-10
'^„**:        # Replace all "^" with "**"
              #  i.e. 3*(5)^3-5*(5)^2-2*(5)-10 → 3*(5)**3-5*(5)**2-2*(5)-10
.E            # Evaluate as Python-eval
              #  i.e. 3*(5)**3-5*(5)**2-2*(5)-10 → 250

वैकल्पिक 25 28 बाइट्स प्रोग्राम जो TIO के वर्तमान संस्करण पर काम करता है:

„*(I')J'xs:'^„**:“…¢(“s')J.e

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

स्पष्टीकरण:

„*(I')J'xs:'^„**:    # Same as explained above
“…¢(“                # Literal string "print("
     s               # Swap both
      ')             # Literal character ")"
        J            # Join everything together
                     #  i.e. 3*(5)**3-5*(5)**2-2*(5)-10 → print(3*(5)**3-5*(5)**2-2*(5)-10)
.e                   # Run as Python code
                     #  i.e. print(3*(5)**3-5*(5)**2-2*(5)-10) → 250

“…¢(“स्ट्रिंग है print(, क्योंकि:

  • और संकुचित स्ट्रिंग को शुरू और समाप्त करता है
  • …¢के बराबर है 0426, क्योंकि यह में सूचकांक पर लग रहा है info.txt फ़ाइल , जहां सूचकांक 4 है, और ¢सूचकांक 26 है।
  • इस इंडेक्स 0426का उपयोग तब डिक्शनरी-फाइल में किया जाता है , जहां लाइन 427 (इंडेक्स 426) यह शब्द है जो इसे लाती है, जो printइस मामले में है।
  • (तो यह है की व्याख्या है, info.txt फ़ाइल में एक सूचकांक जरूरत नहीं है।

2

जावास्क्रिप्ट (Node.js) , 143 बाइट्स

मुझे पता है कि बेहतर उत्तर हैं, लेकिन मैं इसे बिना उपयोग के ही करना चाहता था

(_,x)=>_.match(/[+-]?(?:[a-z0-9.]+|\^-?)+/gi).reduce((a,b)=>~~(b.split('x')[0])*(b.indexOf('x')>0?Math.pow(x,(l=(b.split('^')[1]))?l:1):1)+a,0)

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


आपके regex को इसकी आवश्यकता [a-z0-9.]नहीं है? केवल वही अक्षर दिखाई दे सकता है x। कोई भी क्यों .? आपको गैर-पूर्णांक गुणांक या घातांक को संभालने की आवश्यकता नहीं है।
पीटर कॉर्डेस



2

जावा 8, 150 149 148 बाइट्स

n->s->new javax.script.ScriptEngineManager().getEngineByName("JS").eval(s.replace("x","*"+n).replaceAll((s="(\\-?\\d+)")+"\\^"+s,"Math.pow($1,$2)"))

निश्चित नहीं है कि यदि एक करीबी मेमने का कार्य संभव है जो एक अपवाद फेंकता है। यदि यह है, तो 1 बाइट को बदलते हुए बचाया जा सकता (s,n)->है n->s->-1 बाइट के लिए धन्यवाद @ ओलिवियरग्रेगायर केयह कैसे करना है मुझे दिखाने के ।

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

स्पष्टीकरण:

n->s->     // Method with integer and String parameters and Object return-type
  new javax.script.ScriptEngineManager().getEngineByName("JS")
            //  Use a JavaScript engine
   .eval(s  //  And eval the input
      .replace("x","*"+n)
            //   After all 'x' has been replaced with '*n'
            //   (where `n` is the input-integer)
      .replaceAll((s="(\\-?\\d+)")+"\\^"+s,"Math.pow($1,$2)"))
            //   And all `A^B` have have been replaced with `Math.pow(A,B)`
            //   (where both `A` and `B` are integers)

दुर्भाग्य से जावास्क्रिप्ट eval समर्थन नहीं करता है **, इसलिए मुझे इसे बदलने के लिए इसे बदलने के लिए लंबे समय तक उपयोग करना Math.powहोगा ..


जावास्क्रिप्ट समर्थन करता है **(ES7 +), यह इसका समर्थन क्यों नहीं करता है?
मुहम्मद सलमान

इसके अलावा जावा में कोई इवैल्यूशन नहीं है। यह सही नहीं हो सकता?
मुहम्मद सलमान

@MuhammadSalman नहींं, जावा में कोई नहीं है eval। और मुझे लगता है कि यह बिलियन जावास्क्रिप्ट-ईवल मैं उपयोग कर सकता हूं ScriptEngineManagerजिसे जावा JDK में वर्षों से अपडेट नहीं किया गया है, इसलिए यह समर्थन नहीं करता है ES7+..
केविन क्रूज़सेन

यार, जावा बेकार है, कोई eval क्यों? ठीक है इसे अपडेट क्यों नहीं किया गया?
मुहम्मद सलमान

@MuhammadSalman I dunno .. आपको जावा के रचनाकारों से पूछना होगा। ;)
केविन क्रूज़सेन

2

टीआई-बेसिक, 6 बाइट्स

Prompt X:expr(Ans

अभिव्यक्ति को तर्क के रूप में लिया जाता है और X को रनटाइम के दौरान दर्ज किया जाता है। वैकल्पिक रूप से 8 बाइट्स बिना expr:

Prompt X,u:u

यहां दोनों तर्क रनटाइम पर दर्ज किए जाते हैं।


2

ऑक्टेव , 47 38 37 बाइट्स

एक नंबर के बजाय दूसरे इनपुट को स्ट्रिंग के रूप में लेकर बहुत सारे बाइट्स सहेजे गए।

@(x,c)eval(strrep(x,'x',['*(',c,41]))

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

स्पष्टीकरण:

बहुत सीधे आगे: xद्वारा प्रतिस्थापित करें (c), cदूसरा इनपुट कहां है, और मूल्यांकन करें। ऑक्टेव में पेरेथेस आवश्यक हैं -8^2 == -64




1

रूबी , 43 41 बाइट्स

->p,x{eval p.gsub('^','**').gsub'x','*x'}

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

@ Mr.Xcoder को धन्यवाद दो बाइट्स सहेजे गए


चूंकि रूबी का जवाब नहीं है, फिर भी मैंने एक जोड़ा। एनवीएम एक था जो एक अलग दृष्टिकोण का उपयोग करता था

स्पष्टीकरण:

->p,x{                    # lambda function that takes two arguments p and x
    eval(                 # eval 
        p.gsub(           # replace all instance of 
            '^' , '**'    # `^` with `**` (use for raised to power of)
        )                 # end gsub
        .gsub(            # start another replace all
            'x' , '*x'    # replace all instances of `x` with `*x`
        )                 # end the replace function
    )                     # end eval function
}                         # end lambda function


1

एक्सेल, 36 + 2 बाइट्स, गैर-प्रतिस्पर्धात्मक

एक पाठ क्षेत्र का मूल्यांकन एक सूत्र के रूप में एक्सेल में सीधे आगे नहीं है। एक छिपी हुई =EVALUATE()फ़ंक्शन है, जिसे किसी नाम को परिभाषित करके बुलाया जा सकता है।

Excel 2007 में, सूत्र> नाम निर्धारित करें। एक नाम को परिभाषित करें E, जिसका संदर्भ:

=EVALUATE(SUBSTITUTE(A1,"x","*"&B1))

फिर, फॉर्मूला इनपुट के साथ A1, xवैल्यू इन B1, रिटर्न =Eमें प्रवेश करके C1अपेक्षित परिणाम मिलता है।


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