নাম, কিছু গণিত!


19

ক্রমের ক্রম, পেমডাস গণিতের একটি প্রাথমিক নিয়ম যা আমাদের জানিয়ে দেয় যে কোন আদেশ ক্রিয়াকলাপ সম্পাদন করা উচিত:

"প্যারেন্টেসিস, এক্সপেনশনস, গুণ এবং বিভাগ এবং সংযোজন এবং বিয়োগ"

সমস্যা হচ্ছে, পেমডাস খুব বহুমুখী নয়! যদি আপনি এটি অন্য ক্রমে করতে চান? আমরা প্রথম বন্ধনীগুলির সাথে গণ্ডগোল করব না, তাই তারা সেগুলিতে রাখি (প্রথম)।

এমন একটি প্রোগ্রাম তৈরি করুন যাতে দুটি আর্গুমেন্ট লাগে:

  • একটি স্ট্রিং, ক্রিয়াকলাপগুলি ক্রিয়াকলাপটি অনুসরণ করে telling কিছু উদাহরণ আছে "DAMES", "SAD, ME", "ME SAD", "MEADS"। হ্যাঁ, স্পেস এবং কমাগুলি ঠিক আছে, কারণ এটি অর্ডারটিকে মনে রাখা সহজ করে তোলে।
    • চ্যাটে পরামর্শগুলি অনুসরণ করে: স্পেস এবং কমাগুলি সমর্থন করা এখন alচ্ছিক।
    • যদি কোনও একটি অক্ষর অনুপস্থিত থাকে, বা অতিরিক্ত অক্ষর রয়েছে যা সেখানে না থাকা উচিত, আপনি ইনপুটটিকে অবৈধ বিবেচনা করতে পারেন এবং এটি আপনার পছন্দ মতো আচরণ করতে পারেন।
  • একটি স্ট্রিং, বা এমন একটি অভিব্যক্তি যা অভিব্যক্তিকে মূল্যায়ন করা উচিত।

দশমিক সংখ্যা বা পূর্ণসংখ্যা হিসাবে অভিব্যক্তির ফলাফলটি প্রত্যাবর্তন করুন। উত্তরটি যদি পূর্ণসংখ্যা না হয় তবে এটি একটি দশমিক সংখ্যা হিসাবে ফিরে আসতে হবে।

নিয়মাবলী:

  • আপনার ভাষায় যদি এটি সহজ হয় তবে দুটি ইনপুট আর্গুমেন্টকে একটিতে একত্রিত করা ঠিক আছে।
  • এটি একটি স্ট্রিং হতে হবে না, কিন্তু এটি অক্ষর থাকতে হবে। আপনি 1 এর সাথে সংযোজন, 2 দিয়ে বিভাগ ইত্যাদির বিকল্প রাখতে পারবেন না etc.
  • আপনি প্রথমে কোন ইনপুটটি চয়ন করতে পারেন।
  • এক্সপ্রেশনটি ডান থেকে বাম থেকে ডানদিকে মূল্যায়ন করা হয়। (নিয়মের পরিবর্তন Any যে কোনও জমা দেওয়া পোস্টার প্রথম 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বা BIDMASস্কুলে শেখানো হয়। B= বন্ধনী, Oবা I= অর্ডার বা সূচকগুলি।
BadHorsie

হয় pপ্রয়োজন? এটি উদাহরণগুলিতে নেই
ev3commander

উত্তর:


7

জাভাস্ক্রিপ্ট (ES6) 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

@ ক্রিটিক্সিলিথোস হ্যাঁ তবে এটি আর 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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.