Dames, कुछ गणित करो!


19

संचालन का क्रम, PEMDAS, गणित में एक बुनियादी नियम है जो हमें बताता है कि कौन से आदेश संचालन किए जाने चाहिए:

"कोष्ठक, प्रतिपादक, गुणा और भाग, और जोड़ और घटाव"

समस्या यह है, PEMDAS बहुत बहुमुखी नहीं है! यदि आप इसे किसी अन्य क्रम में करना चाहते हैं तो क्या होगा? हम कोष्ठकों के साथ खिलवाड़ नहीं करेंगे, इसलिए हम उन्हें वहीं रखते हैं जहाँ वे (पहले) हैं।

एक प्रोग्राम बनाएं जिसमें दो तर्क हों:

  • एक स्ट्रिंग, जो यह बताती है कि किस आदेश का पालन करना चाहिए। कुछ उदाहरण हैं "DAMES", "SAD, ME", "ME SAD", "MEADS"। हां, रिक्त स्थान और अल्पविराम ठीक हैं, क्योंकि यह आदेश को याद रखना आसान बनाता है।
    • चैट में निम्नलिखित सुझाव: रिक्त स्थान और अल्पविराम का समर्थन करना अब वैकल्पिक है।
    • यदि अक्षरों में से एक गायब है, या यदि अतिरिक्त पत्र हैं जो वहां नहीं होने चाहिए, तो आप इनपुट को अमान्य मान सकते हैं और इसे पसंद कर सकते हैं लेकिन फिर भी इसे पसंद कर सकते हैं।
  • एक स्ट्रिंग, या एक अभिव्यक्ति जिसमें अभिव्यक्ति का मूल्यांकन किया जाना चाहिए।

किसी दशमलव संख्या, या पूर्णांक के रूप में अभिव्यक्ति का परिणाम लौटाएं। यदि उत्तर पूर्णांक नहीं है, तो उसे दशमलव संख्या के रूप में वापस करना होगा।

नियम:

  • यदि आपकी भाषा में आसान है, तो दो इनपुट तर्कों को एक में जोड़ना ठीक है।
  • इसके लिए एक तार होना जरूरी नहीं है, लेकिन इसके लिए अक्षर होने चाहिए। आप 1 के साथ परिवर्धन, 2 के साथ विभाजन, आदि का विकल्प नहीं दे सकते।
  • आप चुन सकते हैं कि कौन सा इनपुट पहले है।
  • अभिव्यक्ति का मूल्यांकन बाएं से दाएं किया जाता है बाएं से दाएं किया जाता है। (नियम में बदलाव। कोई भी सबमिशन पहले 12 घंटों के लिए पोस्टर करता है, जिसके पास यह दूसरा रास्ता है) को स्वीकार किया जाता है।
  • ऑपरेशन प्रतीकों का उपयोग करते हैं ( ) ^ * / + -:। उदाहरण के लिए, आप ¤इसके +अलावा के लिए उपयोग नहीं कर सकते ।
  • इनपुट अभिव्यक्ति में रिक्त स्थान इनपुट के रूप में मान्य नहीं है
  • Unary +/- इनपुट के रूप में मान्य नहीं है अगर यह सीधे + या - का अनुसरण करता है। 3+-2अमान्य इनपुट के रूप में विचार करें । यह आप की तरह इलाज किया जा सकता है (एक त्रुटि का उत्पादन करने के लिए नहीं है)। तो +या -से धन या ऋण किसी अन्य ऑपरेटर के अनुसार, यह हमेशा की तरह व्यवहार किया जाता है: 3*-3 = -9,sin(-2)=-0.909
  • कार्यक्रम को कड़ाई से अक्षरों का पालन करना चाहिए, इसलिए "EMDAS", 1-3+4 => -6, और "EMDSA", 1-3+4 => 2

उदाहरण:

Input:   "EMDAS", "3+6*2/4-1"   // -> 3+12/4-1 -> 3+3-1 -> 6-1 -> 5
Output:  5

Input:   "DAMES", "3+6*2/4-1"   // -> 3+6*0.5-1 -> 9*0.5-1 -> 4.5-1 -> 3.5
Output:  3.5

Input:   "SAD, ME", "3+6*2/4-1"  // -> 3+6*2/3 -> 9*2/3 -> 9*0.66667 -> 6   
Output:  6

Input:   "ME ADS", "3+5^4/2-3*2 // -> 3+5^4/2-6 -> 3+625/2-6 -> 628/2-6 -> 314-6 -> 308
Output:  308

Input:   "AM EDS", "4*3-sin(0.5^2)*3+1" // -> 4*3-sin(0.5^2)*4 -> 12-sin(0.5^2)*4 -> 4*3-(4*sin(0.5^2)) -> 12-(4*sin(0.5^2)) -> 12-(4*sin(0.25)) -> 12-(4*0.24740) -> 12-0.98961 -> 11.01038
Output:  11.01038

Input:   "DAMES", "4-5-6"   // -> (4-5)-6 -> = -7  
Output:  -7                  // NOT: -> 4-(5-6) -> 4-(-1) -> 5

ध्यान दें, जहां कोष्ठक को दिखाया गया है कि 4*sin(0.5^2)घातांक का मूल्यांकन करने से पहले गुणन का मूल्यांकन किया जाता है।

यह कोड गोल्फ है, इसलिए बाइट्स जीतने वाला सबसे छोटा कोड है।


2
यह बिल्कुल समान नहीं है, लेकिन यह चुनौती संचालन के दूसरे क्रम में बदलने के बारे में है और प्रेरणा थी जिसने मुझे कुछ ऐसा ही करने का विचार बनाया। मुझे लगता है कि हास्केल का उत्तर शायद इस सवाल का जवाब देने के लिए फिर से काम किया जा सकता है ... निश्चित रूप से अगर एक सख्त डुप्लिकेट नहीं है, तो मुझे सीधे ऑपरेटरों को बदलने की मूल क्षमता के बिना इस चुनौती को करने का विचार पसंद है!
डोम हेस्टिंग्स

2
हटाए गए कार्यों के लिए बोनस, लेकिन उदाहरणों में अभी भी पाप () है।
edc65

उपर्युक्त चुनौती की तुलना में कुछ हद तक अधिक बुराई है, और मैं इसे डुप्लिकेट के रूप में नहीं लड़ने जा रहा हूं (हालांकि मूल के लिए लिंक की सराहना की गई होगी)। हालांकि, सभी के लिए यह स्पष्ट है कि 2560 के दुष्ट निर्देशक कोई और नहीं @Stewie ग्रिफिन हैं। मुझे कहना है, मुझे आश्चर्य नहीं है।
जेक

ब्रिटेन में हमें अक्सर इसे स्कूल में BODMASया जैसे ही पढ़ाया जाता है BIDMASB= कोष्ठक, Oया I= आदेश या संकेत।
बैडहोरसी

की pजरूरत है? यह उदाहरणों में नहीं है
ev3commander

जवाबों:


7

जावास्क्रिप्ट (ईएस 6) 349 353 387 400

... शायद अभी भी गोल्फ है

मेरा यह पुराना तोता कभी-कभी काम आता है - (पहले से ही अन्य 2 चुनौतियों में इस्तेमाल किया गया)

E=
(d,x,W=[],Q=['_'],h={'(':1,_:8,')':7},z=1,C=n=>{for(;h[q=Q.pop()]<=h[n];W.push(q=='^'?Math.pow(a,b):eval(`a${q}b`)))a=W.pop(b=W.pop());Q.push(q,n)})=>([...d].map(l=>h[l='+-/*^'['ASDME'.search(l)]]=(d+=!!l),d=1),(x+')').replace(/\D|\d+/g,t=>(u=~~h[t])-1?u-7?u?z&&t=='-'?z=-z:C(t,z=1):(W.push(z*t),z=0):Q.pop(Q.pop(C(t),z=0)):z=!!Q.push('_')),W.pop())

// TEST
console.log=(...x)=>O.innerHTML+=x.join` `+'\n'

console.log(E('MDASE','3+4*5^2'))
console.log(E("EMDAS", "3+6*2/4-1")) // 5
console.log(E("DAMES", "3+6*2/4-1")) //3.5
console.log(E("SAD, ME", "3+6*2/4-1")) // 6
console.log(E("ME ADS", "3+5^4/2-3*2")) // 308
console.log(E("AM EDS", "4*3-sin(0.5^2)*3+1")) // 11.01038 sin not supported
console.log(E("DAMES", "4-5-6")) // -7

// MORE READABLE
U=(d,x,W=[],Q=['_'],h={'(':1,_:8,')':7},z=1,
  C=n=>{
    for(;h[q=Q.pop()]<=h[n];
        W.push(q=='^'?Math.pow(a,b):eval(`a${q}b`)))
      a=W.pop(b=W.pop());
    Q.push(q,n)
  }
)=>(
  [...d].map(l=>h[l='+-/*^'['ASDME'.search(l)]]=(d+=!!l),d=1),
  (x+')').replace(/\D|\d+/g,t=> 
     (u=~~h[t])-1
       ?u-7
         ?u
           ?z&&t=='-'?z=-z:C(t,z=1)
           :(W.push(z*t),z=0)
         :Q.pop(Q.pop(C(t),z=0))
       :(Q.push('_'),z=1)
  ),
  W.pop()
)
<pre id=O></pre>

Ungolfed

Evaluate=(oprec,expr)=>
{
  var tokens = expr.match(/\D|\d+/g).concat(')')
  var t,a,b,v, SignV
  var vstack=[]
  var ostack=['_']
  var op={ '(':8, _: 1, ')':2}
  oprec.match(/\w/g).map((l,p)=>op['+-/*^'['ASDME'.search(l)]]=7-p)
  var OPush=o=>ostack.push(o)
  var OPop=_=>ostack.pop()
  var VPush=v=>vstack.push(v)
  var VPop=v=>vstack.pop()

  var Scan=i=>
  {
    SignV = 1
    for (; t=tokens[i++]; )
    {
      if (t == '(')  
      {
        OPush('_')
        SignV = 1
      }
      else if (t == ')')
      {
        CalcOp(t);
        OPop();
        OPop();
        SignV = 0
      }
      else if (op[t])
      {
        if (SignV && t=='-')
          SignV = -SignV
        else
          CalcOp(t), SignV = 1
      }  
      else
      {
        VPush(SignV*t)
        SignV=0
      }
    }
  }
  var CalcOp=nop=>
  {
    for (; op[po = OPop()] >= op[nop];)
      b=VPop(), a=VPop(), CalcV(a,b,po);
    OPush(po), OPush(nop);
  }
  var CalcV=(a,b,o)=>
  {
//    console.log('CV',a,b,o)
    if (o=='+')
      a+=b
    if (o=='-')
      a-=b
    if (o=='*')
      a*=b
    if (o=='/')
      a/=b
    if (o=='^')
      a=Math.pow(a,b)
    VPush(a)
  }
  Scan(0)

  return VPop()
}

console.log=(...x)=>O.innerHTML+=x.join` `+'\n'

console.log(Evaluate('MDASE','3+4*5^2'))
console.log(Evaluate('EMDAS','3+6*2/4-1')) // 5
console.log(Evaluate("DAMES", "3+6*2/4-1")) //3.5
console.log(Evaluate("SAD, ME", "3+6*2/4-1")) // 6
console.log(Evaluate("ME ADS", "3+5^4/2-3*2")) // 308
console.log(Evaluate("AM EDS", "4*3-sin(0.5^2)*3+1")) // 11.01038 sin not supported
console.log(Evaluate("DAMES", "4-5-6")) // -7
<pre id=O></pre>


मुझे लगता है कि आप (t=>t=='('?(z=1, Q.push('_'))सभी न्यूलाइन्स के साथ ही स्पेस को हटा सकते हैं ।
कॉनर ओ'ब्रायन

1
@ C @O'Bʀɪᴇɴ इस पर काम कर रहा है। धन्यवाद
edc65

मुझे लगता है कि आप बदल सकते हैं Math.pow(a,b)करने के लिएa**b
Kritixi lithos

@KritiiLithos हाँ, लेकिन यह ES6 नहीं होगा
edc65

6

आर 3.3.2: 209 196 187 177 बाइट्स

गैर-अंकगणित ऑपरेटरों <, &,;, ~, ~ का "दुरुपयोग" करने का विचार है? जहां हम पूर्वता जानते हैं ( ?Syntaxआर में देखें - लेकिन ओवरराइड से पहले;)) और उन्हें दिए गए अंकगणितीय ऑपरेटरों के साथ ओवरराइड करना। मानचित्रण संचालन के वांछित क्रम के अनुसार होता है।

इनपुट में रिक्त स्थान और अल्पविराम समर्थित नहीं हैं ।

गोल्फ संस्करण

f=function(a,b){s=substr;l=list(E='^',M='*',D='/',A='+',S='-');q="<&|~?";for(i in 1:5){x=s(q,i,i);y=l[[s(a,i,i)]];assign(x,.Primitive(y));b=gsub(y,x,b,,,T)};eval(parse(text=b))}

असंबद्ध और टिप्पणी:

f = function(a,b) {
  s = substr
  # All arithmetic operators
  l = list(E = '^', M = '*', D = '/', A = '+', S = '-')
  # Some non-arithmetic R operators in descending precedence
  q = "<&|~?"
  for (i in 1:5) {
    # The substituted symbol
    x = s(q, i, i)
    # The original operator which has to be substituted
    y = l[[s(a, i, i)]]
    # Substitute the operator for the R interpreter
    assign(x, .Primitive(y))
    # Substitute the operator in the input string
    b = gsub(y, x, b, , , T)
  }
  # Parse and evaluate
  eval(parse(text = b))
}

उदाहरण:

> f("EMDAS", "3+6*2/4-1")
[1] 5
> f("DAMES", "3+6*2/4-1")
[1] 3.5
> f("SADME", "3+6*2/4-1")
[1] 6
> f("MEADS", "3+5^4/2-3*2")
[1] 308
> f("AMEDS", "4*3-sin(0.5^2)*3+1")
[1] 11.01038
> f("DAMES", "4-5-6")
[1] -7
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.