স্ট্যাকিমাথের ব্যাখ্যা!


14

আমার নতুন স্ট্যাক ভিত্তিক ভাষা বাস্তবায়নের জন্য আপনার সময়! একে স্ট্যাকিমাথ বলে। এটি স্ট্যাকের উপর ভিত্তি করে 8 টি অপারেশন এবং স্ট্যাকটিতে সংখ্যা যুক্ত করার উপায়গুলির সাথে স্ট্যাক ভিত্তিক ভাষা হবে।

কার্যক্রমের তালিকা:

  • /: বিভাগ। স্ট্যাকের শীর্ষ 2 সংখ্যায় পারফর্ম করা। ফলকে স্ট্যাকের দিকে পিছনে ঠেলে দেয়।
  • *: গুণ। স্ট্যাকের শীর্ষ 2 সংখ্যায় পারফর্ম করা। ফলকে স্ট্যাকের দিকে ফিরে ঠেলে দেয়
  • -: বিয়োগ স্ট্যাকের শীর্ষ 2 সংখ্যায় পারফর্ম করা। ফলকে স্ট্যাকের দিকে ফিরে ঠেলে দেয়
  • +: সংযোজন. স্ট্যাকের শীর্ষ 2 সংখ্যায় পারফর্ম করা। ফলকে স্ট্যাকের দিকে ফিরে ঠেলে দেয়
  • ^: এক্সপেনশনেশন। স্ট্যাকের শীর্ষ 2 সংখ্যায় পারফর্ম করা। ফলকে স্ট্যাকের দিকে ফিরে ঠেলে দেয়
  • %: মডুলো. স্ট্যাকের শীর্ষ 2 সংখ্যায় পারফর্ম করা। ফলকে স্ট্যাকের দিকে ফিরে ঠেলে দেয়
  • !: কারখানা। স্ট্যাকের শীর্ষ নম্বরে পারফর্ম করা। ফলকে স্ট্যাকের দিকে পিছনে ঠেলে দেয়
  • D: স্ট্যাকের শীর্ষ নম্বরটি নকল করুন

সিউডো কোডে সংজ্ঞায়িত অপারেশন:

  • /: push(pop divided by pop)
  • *: push(pop times pop)
  • -: push(pop minus pop)
  • +: push(pop plus pop)
  • ^: push(pop to the pop)
  • %: push(pop mod pop)
  • !: push(factorial pop)
  • D: t = pop; push(t); push(t)

কীভাবে সংখ্যাগুলিকে স্ট্যাকের দিকে ঠেলাবেন:

স্ট্যাকটিতে সংখ্যা যুক্ত করা সহজ, আপনার প্রোগ্রামে যেখানে প্রয়োজন সেখানে কেবল কাঁচা সংখ্যাটি রাখুন। যদি আপনাকে স্ট্যাকের উপর একাধিক নম্বর লাগাতে হয় তবে আপনি সেগুলি কমা ( ,) দিয়ে আলাদা করতে পারেন । আপনার প্রোগ্রামটির ইনপুটটিতে -নম্বরগুলি প্রক্রিয়া করার প্রয়োজন হবে না , যদি ব্যবহারকারী একটি চায় তবে তাদের যে নম্বরটি উপেক্ষিত, শূন্য এবং তারা চান তা চাপ দিতে হবে -। প্রোগ্রামটির ইনপুটটিতে নম্বরগুলিও ইতিবাচক পূর্ণসংখ্যার জন্য সীমাবদ্ধ।

ইনপুট:

আপনার প্রোগ্রাম এসটিডি থেকে কমান্ড লাইন ইনপুট নিতে হবে, বা। ইনপুট শুধুমাত্র সংখ্যা (কোন বৈজ্ঞানিক স্বরলিপি বা দশমিক) দ্বারা সীমায়িত নিয়ে গঠিত হবে ,হিসাবে প্রয়োজন এবং ক্রিয়াকলাপ উপরে সংজ্ঞায়িত।

আউটপুট:

আপনার প্রোগ্রামটি স্ট্যাকের শীর্ষে নম্বরটি মুদ্রণ করা উচিত।

ত্রুটির ক্ষেত্রে:

  • প্রোগ্রামটি যদি স্ট্যাকটিকে ওভার-পপ করার চেষ্টা করে তবে আপনার মুদ্রণ করা উচিত StackUnderflowException!!!
  • আপনার যদি শূন্য দ্বারা বিভাগ থাকে তবে মুদ্রণ করুন DivisionByZeroException!!!
  • যদি কোনও সংখ্যা যা -৪-বিট অতিক্রম করে, হয় প্রোগ্রামটি সঞ্চালনের সময় বা ইনপুটটিতে কোনও নম্বর প্রক্রিয়াকরণের সময়, মুদ্রণ করুন NumberOverflowException!!!
  • যদি কোনওভাবে আপনি স্ট্যাকের শীর্ষে নেতিবাচক নম্বর পান এবং আপনাকে একটি ফ্যাক্টরিয়াল, মুদ্রণ করতে হবে NegativeFactorialException!!!
  • আপনার যদি স্ট্যাকের শীর্ষে একটি ভাসমান পয়েন্ট নম্বর থাকে এবং পরবর্তী ক্রিয়াকলাপটি ফ্যাকটোরিয়াল হয় তবে মুদ্রণ করুন FloatingFactorialException!!!
  • প্রোগ্রামটি প্রস্থান করার সময় কোনও সংখ্যা স্ট্যাকের মধ্যে না থাকলে (যেমন প্রোগ্রামটি খালি ছিল) মুদ্রণ EmptyProgram!!!

মন্তব্য:

  • সমস্ত ত্রুটি আউটপুট এর yo স্ট্যান্ড এরর বা নিকটতম সমতুল্য হওয়া উচিত।
  • সমস্ত সংখ্যা 64৪-বিট ভাসমান স্থানে সীমাবদ্ধ।

প্রোগ্রামসমূহ উদাহরণ:

50,47*                 -> 2350
50,47/                 -> 0.94
100,8!                 -> 40320  
100D*                  -> 10000
!                      -> StackUnderflowException!!!
5,2/!                  -> FloatingFactorialException!!!  
4,3!2*/                -> 3 
654,489,48,43/5*7D+-*% -> 77.68749999999909
                       -> EmptyProgram!!!

(প্রয়োজনে আমি আরও যোগ করতে পারি)


3
যদি এটি ত্রুটির ক্ষেত্রে না হয়, ভিট্টি প্রাকৃতিকভাবে এটি করতে পারে (রূপান্তর !করা ব্যতীত F)।
অ্যাডিসন ক্র্যাম্প

আমি বুঝতে পেরেছিলাম, এ কারণেই আমি এগুলিকে অন্তর্ভুক্ত করেছি।
জে আতকিন

3
আপনার স্কোপটি কিছুটা বিস্তৃত, যদিও এটি বিতর্কযোগ্য
ডিজিটাল ট্রমা

বাহ, আমি সেটার কথা ভুলে গেছি তবে আমি মনে করি না যে তারা ত্রুটিযুক্ত কারণ আপনার ত্রুটিগুলি প্রক্রিয়া করতে হবে এবং আরও অপারেটরগুলি খনিতে সংজ্ঞায়িত হয়েছে।
জে আতকিন

654,489,48,43/5*7D+-*%ফিরে আসা উচিত 77.6875। ( 43/48*5-(7+7)হওয়া উচিত (7+7)-43/48*5)
user81655

উত্তর:


4

রুবি, 412 410 404 392 380 377 টি অক্ষর

def e m,x='Exception';warn m+x+?!*3;exit;end
def o;e'StackUnderflow'if$*==[];$*.pop;end
u=->n{e'DivisionByZero'if n.infinite?;e'NumberOverflow'if n>2**64;$*<<n}
f=->n{e'NegativeFactorial'if n<0;e'FloatingFactorial'if n.to_i<n;n<2?1:f[n-1]*n}
gets.gsub(/(\d+)|([+*\/%^-])|(!)|D/){$1?u[$1.to_f]:$2?u[eval"o#{$2>?A?:**:$2}o"]:$3?u[f[o]]:u[x=o]+u[x]}
e'EmptyProgram',''if$*==[]
p o

এটি নিয়মিত নির্ভুলতা সংস্করণ ব্যবহার করে Float। ফলাফলের যথার্থতা নমুনা কোডের মতোই, তবে সংখ্যাগত ওভারফ্লো সনাক্তকরণ সঠিক নয়।

নমুনা রান:

bash-4.3$ ruby StackyMath.rb <<< '654,489,48,43/5*7D+-*%'
77.68749999999909

রুবি, 378 377 টি অক্ষর

def e m,x='Exception';warn m+x+?!*3;exit;end
def o;e'StackUnderflow'if$*==[];$*.pop;end
u=->n{e'NumberOverflow'if n>2**64;$*<<n}
f=->n{e'NegativeFactorial'if n<0;e'FloatingFactorial'if n.to_i<n;n<2?1:f[n-1]*n}
gets.gsub(/(\d+)|([+*\/%^-])|(!)|D/){$1?u[Rational$1]:$2?u[eval"o#{$2>?A?:**:$2}o"]:$3?u[f[o]]:u[x=o]+u[x]}rescue e'DivisionByZero'
e'EmptyProgram',''if$*==[]
p o.to_f

এটি ব্যবহার করে উচ্চ নির্ভুলতা সংস্করণ Rational। ফলাফলের নির্ভুলতা সর্বদা নমুনা কোডের মতো হয় না তবে সংখ্যার ওভারফ্লো সনাক্তকরণ হুবহু।

নমুনা রান:

bash-4.3$ ruby StackyMath-hi.rb <<< '654,489,48,43/5*7D+-*%'
77.6875

3

জাভাস্ক্রিপ্ট (ES6), 430 বাইট

ES7 এর সাথে 422 বাইট পরিবর্তন Math.pow(2,2)করে2**2

e=m=>{throw alert(m)};u=prompt();u?alert(eval('u.match(/\\d+|[^,]/g).map(o=>s.push(t=o=="/"?(b=p(a=2))?a/b:e`DivisionByZero43*"?2*23-"?2-23+"?2+23%"?2%23^"?Math.pow(2,2)3D"?s.push(r=2)&&r3!"?eval("for(r=i=2;i<0?e`Negative54:i%1?e`Floating54:--i;)r*=i;r"):+o)&&t==Infinity&&e`NumberOverflow4,s=[],p=_=>s.length?s.pop():e`StackUnderflow4);t'.replace(/[2-5]/g,x=>[,,'p()',':o=="','Exception!!!`','Factorial'][x]))):e`EmptyProgram!!!`

ব্যাখ্যা

evalনির্দিষ্ট কিছু সাধারণ বাক্যাংশ প্রতিস্থাপন করতে ব্যবহার করে। নিরবচ্ছিন্ন এবং এটি ছাড়া evalএটি দেখতে দেখতে:

e=m=>{throw alert(m)};                           // e = throw error, alert displays
                                                 //     message, throw stops execution
u=prompt();                                      // u = received input
u?alert(                                         // display the result
  u.match(/\d+|[^,]/g)                           // get array of numbers and operators
    .map(o=>                                     // iterate over operators
      s.push(t=                                  // t = last pushed value

        // Execute operator
        o=="/"?(b=p(a=p()))?a/b:                 // make sure argument B is not 0
          e`DivisionByZeroException!!!`:
        o=="*"?p()*p():
        o=="-"?p()-p():
        o=="+"?p()+p():
        o=="%"?p()%p():
        o=="^"?Math.pow(p(),p()):
        o=="D"?s.push(r=p())&&r:
        o=="!"?eval("                            // eval to enable for loop in ternary
          for(                                   // no factorial in JS so do this manually
            r=i=p();
            i<0?e`NegativeFactorialException!!!` // check for errors
              :i%1?
                e`FloatingFactorialException!!!`
                :--i;
          )
            r*=i;
          r"):                                   // return r
        +o                                       // if not an operator cast as a number
      )&&t==Infinity&&                           // JS turns anything over 64 bit float
        e`NumberOverflowException!!!`,           //     max value into Infinity
      s=[],                                      // s = stack array
      p=_=>s.length?s.pop():                     // p = check stack then pop
        e`StackUnderflowException!!!`
    )&&t                                         // return top stack element
  ):e`EmptyProgram!!!`                           // error if input length is 0

আপনি যদি ES7 এ আপগ্রেড করতে চান তবে আপনি এর সাথে প্রতিস্থাপন করতে ES7 এক্সফোনেনটিশন অপারেটরটি ব্যবহার করতে পারেন । Math.pow(p(),p())p()**p()
বন্ধুরা

1
@ ইউসুফ্রেন্ডস আমি এটি সম্পর্কে ভাবছিলাম, তবে এর অর্থ হ'ল এটি আমার ব্রাউজারে কাজ করবে না তাই আমি এটিকে ছেড়ে দিয়েছি। : পি আমি এই বলে একটি নোট যুক্ত করব।
ব্যবহারকারী 81655

1

গ্রোভি, 718 বাইট। ফোর!

পাশাপাশি আমার ইমপ্লান গল্ফ পোস্ট করতে পারে। আমার কোডের বড় প্রাচীরের সাথে দেখা করুন:

g='Exception!!!'
a={System.err.print(it);System.exit(1)}
b=new Stack()
c={b.push(it)}
v=2d**64d
d={b.pop()}
e={if(b.size()<it)a('StackUnderflow'+g)}
f={a('NumberOverflow'+g)}
h={e(2)
c(Eval.xy(d(),d(),"x$it y"))
if(b.peek()>v)f()}
k={i->if(i<0)a('NegativeFactorial'+g)
if(Math.abs(i-(i as long))>1E-6)a('FloatingFactorial'+g)
(2..i).inject{x,y->(v/x<y)?f():x*y}}
l=['/':{e(2)
m=d()
n=d()
if(n==0)a('DivisionByZero'+g)
c(m/n)},'!':{e(1)
c(k(d()))},'D':{e(1)
c(b.peek())}]
System.in.newReader().readLine().findAll(~/\d+|[^,]/).each{x->if(x.matches(/\d+/))try{c(x as double)}catch(Exception e){f()}
else if("+-*%^".contains(x))h(x.replace('^','**'))
else l[x]()}
if(b){o=d()
if(Double.isInfinite(o))f()
println o}else a('EmptyProgram!!!')

Ungolfed:

error = {System.err.print(it);System.exit(1)}

stack = new Stack()
maxVal = 2d**64d

push = {stack.push(it)}
pop = {stack.pop()}

checkAtLeast = {if (stack.size() < it) error('StackUnderflow'+exception)}
numberOverflow = {error('NumberOverflow'+exception)}

exception = 'Exception!!!'

def dArgOp(i) {
    checkAtLeast(2)
    push(Eval.xy(pop(), pop(), "x$i y"))
    if(stack.peek() > maxVal) numberOverflow
}

factorial = {i->
    if (i < 0)
        error('NegativeFactorial'+exception)
    if (Math.abs(i - (i as long)) > 1E-6)
        error('FloatingFactorial'+exception)
    (2..i).inject {acc, it ->
        (maxVal/acc < it)?numberOverflow():acc*it
    }
}

ops = [
'/' : {
    checkAtLeast(2)
    first = pop()
    second = pop()
    if (second == 0)
        error('DivisionByZero'+exception)
    push(first / second)
},
'!' : {
    checkAtLeast(1)
    push(factorial(pop()))
},
'D' : {
    checkAtLeast(1)
    push(stack.peek())
}]

input = System.in.newReader().readLine()
tokens = input.findAll(~/\d+|[^,]/)

tokens.each {
    print "current token: $it  \t stack before eval: $stack "
    if (it.matches(/\d+/))
        try {
            push(it as double)
        } catch (Exception e) {
            numberOverflow()
        }

    else if ("+-*%^".contains(it))
        dArgOp(it.replace('^','**'))
    else
        ops[it]()
    println "result: ${stack.peek()}"
}

if (stack) {
    top = pop()
    if (Double.isInfinite(top))
        numberOverflow()
    println top
} else
    error('EmptyProgram!!!')

সম্পাদনা 1: 15 ডলারকনবকে 15 ডলার বাঁচাতে ধন্যবাদ
2 সম্পাদনা করুন 2: আরও কয়েকটি কৌশল দিয়ে ~ 130 বাইট ফেলে দিন


আমি গ্রোভিকে জানি না, তবে আপনার কাছে মনে হয় প্রচুর অপ্রয়োজনীয় সাদা জায়গা রয়েছে p উদাহরণস্বরূপ, অপারেটরগুলির কাছাকাছি for/ পরে if, ইত্যাদি
ডোরকনব

ওহো, সাদা স্থান সরিয়ে ফেলতে সবেমাত্র আরও অনেক জায়গাগুলি লক্ষ্য করেছেন। টিপ জন্য ধন্যবাদ.
জে আতকিন

আপনি System.in.textপরিবর্তে ব্যবহার করতে পারেন System.in.newReader().readLine()
একটি স্প্যাগেটো

আসলে তা না. .textলোভী এবং পাঠকের মধ্যে যতক্ষণ তথ্য রয়েছে ততক্ষণ তা ফিরে আসবে না।
জে আতকিন

ঠিক আছে, তবে এটি কোড-গল্ফ। লোকেরা যদি তাদের ইনপুট পরে কন্ট্রোল-ডি টাইপ করতে হয় তবে এটি বড় কথা নয়।
একটি স্প্যাগেটো

1

ক্যান্ডি , 298 348 392 বাইট

যদিও ক্যান্ডি স্ট্যাক ভিত্তিক, তবে আমি নিশ্চিত নই যে সত্যিই সাহায্য করেছে ...

&{|"EmptyProgram!!!\n"(;).}(=bYZay0=zx4k"!%*+,-/D^"(iYe{Z=x})aYb=z=ya=X{Y{cZ0=yza}b212202221(i=ZXe{y})a0=zcY0j{XjZ{|D1b#64R(=c2*)c>{b"NumberOverFlow"(;)i}}|i}aZ{(=)"Exception!!!\n"(;).}0=yz|A#48-Z#10*+=z1=y})c?(=).@0&<{1|b"StackUnderflow"(;)c0}.@1~ALe{A0<{b"Negative"(;)i|1bAR(=cA*)}|b"Floating"(;)i}Z{b"Factorial"(;)}.@2W%.@3*.@4+@5.@6W-.@7WD{/|b"DivisionByZero"(;)i}.@8~A.@9=xK=y=1bA_(cX*).

ফর্ম্যাট করা কিছু কাঠামো প্রকাশ করে:

&{|"EmptyProgram!!!\n"(;).}
(=bYZay0=zx4k
  "!%*+,-/D^"
  (iYe{Z=x})
  aYb=z=ya=X
  {
    Y{cZ0=yza}b
    212202221(i=ZXe{y})
    a0=zcY0j
    {XjZ{|D1b#64R(=c2*)c>{b"NumberOverFlow"(;)i}}|i}
    aZ{(=)"Exception!!!\n"(;).}
    0=yz|A#48-Z#10*+=z1=y
  }
)c?(=).
@0&<{1|b"StackUnderflow"(;)c0}.
@1~ALe{A0<{b"Negative"(;)i|1bAR(=cA*)}|b"Floating"(;)i}Z{"Factorial"(;)}.
@2W%.@3*.@4+@5.@6W-.@7WD{/|"DivisionByZero"(;)i}.@8~A.@9=xK=y=1bA_(cX*).

আসল গণিতটি শেষ দুটি লাইনে ঘটে। এটি তৃতীয় লাইনে একটি জাম্প টেবিল দ্বারা চালিত।


ডাং, আমি দেখতে পাচ্ছি যে আমি ডিভিশনবিজিরো, নেতিবাচক ফ্যাক্টরিয়াল এবং ওভারফ্লো মিস করেছি। আমি শুধু পরীক্ষার মামলার দিকে তাকিয়ে ছিলাম!
ডেল জনসন

বাহ, এটা দুর্দান্ত। আমার কেবল ক্যান্ডি সন্ধান করা দরকার।
জে আতকিন

আমি এখনও ওভারফ্লো কীভাবে সংজ্ঞায়িত করব তা নিয়ে কাজ করছি ।
ডেল জনসন

আসলে আমার উত্তরে আমারও একই সমস্যা ছিল। আমার উত্তর নীচে মন্তব্য দেখুন।
জে আতকিন

এখনই ওভারফ্লো স্থির করে নিন। আমি রুবি হিসাবে একই পদ্ধতির ব্যবহার করেছি, যা প্রতিটি অপারেশন শেষে 2 ^ 64 এর সাথে তুলনা করার জন্য।
ডেল জনসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.