সংখ্যা এবং অপারেটরগুলির তালিকা হিসাবে একটি ক্যালকুলেটর


20

আপনার কাজটি হল যুক্তিগুলির একটি তালিকা নেওয়া যা হয় হয় পূর্ণসংখ্যা বা অপারেটর, এবং তাদের এভাবে পার্স করা:

  1. এখানে একটি বর্তমান অপারেটর রয়েছে, যা + হিসাবে শুরু হয়।

  2. প্রতিবার কোনও অপারেটর সন্ধান পেলে, বর্তমান অপারেটর এতে পরিবর্তন হবে।

  3. সম্ভাব্য অপারেটরগুলি হলেন: "+", "-", "*", "/", এবং "%", যা সি এবং বেশিরভাগ ভাষায় তাদের অর্থের সাথে মিলে যায়।

  4. এখানে একটি চলমান সমাধান রাখা আছে, যা 0 থেকে শুরু হয়।

  5. প্রতিবার কোনও পূর্ণসংখ্যার সন্ধান পাওয়া গেলে, সমাধানটি অপারেটরের উপর নির্ভর করে সংখ্যা দ্বারা সংশোধন করা হয়; যেমন অপারেটর যদি "/" হয় তবে সমাধানটি সংখ্যা দ্বারা ভাগ করা হয়।

  6. যদি কোনও ক্রিয়াকলাপের ফলে কোনও মিশ্র সংখ্যার ফলাফল হয় (দশমিকের সাথে) তবে এটি অবশ্যই পূর্ণসংখ্যায় ফিরে যেতে হবে (অর্থাত্ দশমিকটি কাটা উচিত)।

  7. চূড়ান্ত সমাধান আউটপুট।

উদাহরণ স্বরূপ:

যুক্তিগুলির 5 8 25 * 9 6 2 - 104 / 4 7 + 6 % 14ফলাফল:

  5 8  25 * 9   6    2    - 104  / 4    7      + 6 % 14
0 5 13 38   342 2052 4104   4000   1000 142   148    8  -> 8

ইনপুটগুলি কমান্ড-লাইন বা ফাংশন আর্গুমেন্ট বা আপনার ভাষার জন্য সমতুল্য হবে।

সবচেয়ে কম কোড জয়!


আপনি যখন সি এর অর্থগুলি বোঝায় তখন কি আপনি ঠিক %সেটির মতোই বোঝাচ্ছেন , বা 0-র পরিবর্তে -ইনফের দিকে যদি গোল হয় তবে তা ঠিক ?
মাল্টেসেন

@ মাল্টেসেন: আপনার ভাষা যাই হোক না কেন।
ট্রেবুচেট

3
ইনপুট থেকে পূর্ণসংখ্যাগুলি কি নেতিবাচক হতে পারে?
ডেনিস

3 এবং 6 পয়েন্টগুলি একে অপরের বিরোধিতা করে: সি এবং বেশিরভাগ ভাষায়, মেঝে না দিয়ে শূন্যের দিকে পূর্ণসংখ্যা বিভাগের বৃত্তাকার হয়।
পিটার টেলর

এটির মতোই আরেকটি চ্যালেঞ্জটি দেখতে আকর্ষণীয় হবে তবে প্যারেন্টেসিসের অগ্রাধিকার সহ ...
জোশপবারন

উত্তর:


6

পাইথ - 24 23 22 20 বাইট

2 বাইট সংরক্ষিত হয়েছে @ আইসাককে এবং 1 ধন্যবাদ @ অর্পকে!

এর বেস কেসগুলির সাথে হ্রাস ব্যবহার করে 0এবং 'স্ট্রিং বনাম ইন্টিরিটি সনাক্ত করতে পুনরায় থাকা অবস্থায় পরীক্ষা করে ।

u.xsv++GbH&=bHG+\+QZ

অনলাইনে কাজ করে না কারণ আমি সুরক্ষার কারণে অনলাইনে অক্ষম সম্পূর্ণ ইওল ব্যবহার করি। যেমন একটি তালিকাতে stdin থেকে ইনপুট নেয়: 5, 8, 25, "*", 9, 6, 2, "-", 104, "/", 4, 7, "+", 6


আপনি এর থেকে সুইচিং 2 বাইট সংরক্ষণ করতে পারবেন ?করার .xকারণ শুধুমাত্র অন্য ব্লক একটি ব্যতিক্রম নিক্ষেপ পারেন, এবং এটি প্রত্যেক সময় এটা করতে হবে। Kযদিও আপনি আর ব্যবহার করতে পারবেন না । u.xsv++GbH&=bHG+\+QZবিশেষভাবে।
isaacg

6

জাভাস্ক্রিপ্ট (ES6) 53

ইনপুট হিসাবে একটি অ্যারে গ্রহণ করা একটি ফাংশন।

পরীক্ষার জন্য ফায়ারফক্সে স্নিপেট চালান।

f=a=>a.map(t=>t<'0'?o=t:v=eval(v+o+t)|0,v=0,o='+')&&v

// TEST
out=x=>O.innerHTML=x;

input = [5,8,25,"*",9,6,2,"-",104,"/",4,7,"+",6,"%",14];
out(input.join(' ')+' -> '+f(input));

function go() {
  i=I.value.split(/ +/),out(I.value+' -> '+f(i))
}  
<pre id=O></pre>
Your test:<input id=I><button onclick='go()'>GO</button>


4

জুলিয়া, 85 83 বাইট

s->(o=0;p="+";for i=split(s) isdigit(i)?o=eval(parse("ifloor($o$p$i)")):(p=i)end;o)

এটি একটি নামবিহীন ফাংশন তৈরি করে যা স্ট্রিংটিকে ইনপুট হিসাবে গ্রহণ করে এবং পূর্ণসংখ্যা ফেরত দেয়।

Ungolfed:

function f(s::String)
    # Assign the starting output value o and operator p
    o = 0
    p = "+"

    # Split the input string into an array on spaces
    for i = split(s)
        if isdigit(i)
            # Assign o using string interpolation
            o = eval(parse("ifloor($o $p $i)"))
        else
            # Assign p to the new operator
            p = i
        end
    end
end

স্থির সমস্যা এবং গ্লেন ওকে ধন্যবাদ 2 বাইট সংরক্ষণ করা।


জুলিয়া অভিযোগ করে যে o is not definedআপনি যখন নতুনভাবে ফাংশনটি চালানোর চেষ্টা করবেন। এটি ফাংশনের অভ্যন্তরের পরিবর্তে মূলতে "o = ifloor ..." ফাংশনটি চালানোর চেষ্টা করে (এখানে github.com/JuliaLang/julia/issues/2386 দেখুন )। আমি কি পরামর্শ দেব s->(o=0;p="+";for i=split(s) isdigit(i)?o=eval(parse("ifloor($o$p$i)")):p=i;end;o)?
গ্লেন ও

@ GlenO আমি জানি না আমি কীভাবে এটি ধরলাম না। : / ধন্যবাদ, স্থির।
অ্যালেক্স এ।

4

এলিস্প, 101 বাইট

যুক্তিগুলির সাথে একটি উদ্ধৃত তালিকা হিসাবে পাস হয়েছে: যেমন (c '(5 5 * 10))

    (defun c(a)(let((f 0)(o '+))(dolist(x a)(if(not(integerp x))(setf o x)(setq f (eval(list o f x)))))f))

নতুন লাইন সহ সংস্করণ:

    (defun c (a)
      (let ((f 0)
            (o '+))
        (dolist (x a)
          (if (not (integerp x))
              (setf o x) 
            (setq f (eval (list o f x)))))
        f))

4

সিজেম, 24 বাইট

0'+ea+{_A,s&O{:O;}?S}%s~

এটি একটি সম্পূর্ণ প্রোগ্রাম যা ইনপুটটি কমান্ড-লাইন আর্গুমেন্ট হিসাবে পড়ে।

অনলাইন কোড চেষ্টা করে দেখতে CJam ব্যাখ্যাকারী (যা কমান্ড লাইন আর্গুমেন্ট সমর্থন করে না), প্রতিস্থাপন eaসঙ্গে lS/কৃত্রিম stdin থেকে পড়তে।

কিভাবে এটা কাজ করে

0'+                       Push a 0 and the character '+'.
   ea                     Push the array of command-line arguments.
     +                    Prepend the character to the array.
      {             }%    For each element:
       _                    Push a copy.
        A,s                 Push "0123456789".
           &                Intersect the copy with the string of digits.
             {   }?         If the intersection is non-empty:
            O                 The element is a number. Push O.
              :O;             The element is an operator. Save it in O.
                   S        Push a space.
                      s~  Flatten the array of strings and evaluate it.

3

জাভাস্ক্রিপ্ট, 85 বাইট

r=0;o="+";prompt().split(" ").forEach(t=>+t+1?r=parseInt(eval(r+o+ +t)):o=t);alert(r)

কেন o+ +t? আপনি যাইহোক স্ট্রিং তৈরি করছেন, সংখ্যায় রূপান্তর করার দরকার নেই। অধিকন্তু, .forEachকোড গল্ফের কোনও স্থান নেই: ব্যবহার করুন.map
edc65


prompt(o="+",r=0).split(" ").forEach(t=>+t+1?r=+eval(r+o+ +t):o=t);alert(r)-> 75 বাইট।
ইসমাইল মিগুয়েল

3

লুয়া, 142 বাইট

function f(s)o="+"r=0 for c in s:gmatch"%S+" do if tonumber(c)~=nil then loadstring("r=r"..o..c)() else o=c end r=math.floor(r)end print(r)end

Ungolfed:

function f(s)
    o="+" --original operator
    r=0 --return value
    for c in s:gmatch"%S+" do --split by spaces
        if tonumber(c)~=nil then --check if the current character is a number
            loadstring("r=r"..o..c)() --appends the current operator and current character ex "r=r+5" and then evaluates as another Lua script 
        else 
            o=c --if the character is not a number, it is the new operator
        end
        r=math.floor(r) --floor after each operation
    end 
    print(r) --print the result
end

3

পাওয়ারশেল, 57 বাইট

$o="+"
$args|%{$r=iex "$r$o$_"
if(!$?){$o=$_}$r-=$r%1}
$r

ungolfed;

$operator="+"
$args | ForEach-Object
{
    $result = Invoke-Expression "$result $operator $_"
    if(!$?)
    {
        $operator=$_
    }
    $result -= $result % 1
}
$result

যদি প্রতিটির জন্য অন্তর্ভুক্ত চলকটি সংখ্যার পরিবর্তে অপারেটর হয় তবে ইনভোক-এক্সপ্রেশন (POSH এর eval()) ব্যর্থ হবে এবং কার্যকর করার স্থিতিটি $?মিথ্যা হবে।

POSH এর মেঝে অযৌক্তিক - $foo=[math]::floor($foo)এবং $foo-=$foo%1আমি যে গল্ফিয়েস্ট বিকল্পের কথা ভাবতে পারি।


খুশী হলাম। আমি স্ট্রিং ইনপুট ধরে ধরে এবং স্পেসে পার্স করে, পরে ifঅঙ্কগুলিতে যুক্ত করে, তবে মূলত একইভাবে আরও কিছুটা আক্ষরিকভাবে পড়ি । 89 বাইটস $o="+";$r=0;$args-split'\s+'|%{if($_-match'^\d+$'){$r=iex $r$o$_;$r-=$r%1}Else{$o=$_}};$r
অ্যাডমবর্কবর্ক

3

জিএনইউ শেড (ওভাল এক্সটেনশন সহ, + ডিসি), ১০২

(স্কোরটিতে -r বিকল্পের জন্য +1 অন্তর্ভুক্ত রয়েছে))

s/.*/0 + &p/
s/([-+/*%]) ([0-9]+)/\2 \1/g
:
s/([-+/*%] )([0-9]+ )([0-9]+)/\1\2\1\3/
t
s/.*/dc<<<'&'/e

ইনপুট এক্সপ্রেশনটিকে পাল্টে পালিশ স্বরলিপিতে রূপান্তর করে এবং তারপরে dcএটি মূল্যায়নের জন্য ব্যবহার করে।

পরীক্ষার আউটপুট:

$ sed -rf calclist.sed <<< '5 8 25 * 9 6 2 - 104 / 4 7 + 6 % 14'
8
$ 

2

সিজেম, 34 বাইট

'+0lS/{"+-*/%"1$#){@;\}{i2$~}?}/\;

এটি অনলাইনে চেষ্টা করুন

আমি ভেবেছিলাম এটি মোটামুটি যুক্তিসঙ্গত হতে চলেছে। তবে আমি কমপক্ষে এক মুহুর্তের জন্য এটির সংক্ষিপ্ততম সিজেএম উত্তর হতে পোস্ট করার পক্ষে দ্রুত ছিলাম না। :(


2

পাইথন 3 - 131 বাইট 129 বাইট 121 বাইট 116 বাইট

দুটি বাইট শেভ করার জন্য মালটিসেনকে ধন্যবাদ, 8 টি শেভ করার জন্য বিটা ডেক এবং 5 রানের শেভের জন্য স্টিভেন রাম্বালস্কিকে ধন্যবাদ

def f(x):
    a,b="+",0
    for i in x:
        if i in"+-*/%":a=i
        else:b=int(eval(str(b)+a+i))
    return b

আমি যদি বিবৃতিটির দৈর্ঘ্য হ্রাস করার জন্য একটি উপায় বের করার চেষ্টা করছি তবে আপাতত এটিকে আমি যতটা পেতে পারি তেমন গল্ফ বলে মনে হচ্ছে। তালিকা হিসাবে ইনপুট নেয়।


আপনি এবং খাঁজের উপর কিছু বাইট সংরক্ষণ করতে পারবেন প্রতিস্থাপন intসঙ্গে//1
Maltysen

এছাড়াও, কেন প্যারেনগুলি `যদি?
মালটিসেন

@ মালতীসেন হুফ, আমি ভুলে গিয়েছিলাম যে যদি বিবৃতিতে আমার প্রথম বন্ধনী প্রয়োজন হয় না। ধন্যবাদ। আমি মনে করি না যে // 1 ব্যবহারের অনুমতি দেওয়া হবে, যদিও আমি এটি ব্যবহার করার কথা ভাবিনি, কারণ এটি অনুমান করা হয় (যেমন 10.0) যা অনুমিত হয় বলে আমি মনে করি না।
কোলে

আমি মনে করি না যে আপনার কাছে উক্ত স্থান inএবং উদ্ধৃতিটির মধ্যে দরকার ।
মালটিসেন 1'15

ফাংশন আর্গুমেন্টে তালিকাটি পাস হয়ে গেছে এবং এ থেকে মুক্তি পেয়ে ধরে আপনি কিছু বাইট সংরক্ষণ করতে পারেন .split()
বিটা ক্ষয়

2

বাশ, 69

set -f
for t in $*
do
((1${t}1>2))&&((r${o-+}=$t))||o=$t
done
echo $r

এটি কেবল অ-নেতিবাচক পূর্ণসংখ্যার সাথে কাজ করে - এটি ঠিক আছে কি না তা প্রশ্নে পরিষ্কার নয়।


2

গ্রোভি, 79 বাইট

def f(x,a=0,b='+'){x.each{z->a=z=~/\d/?Eval.me(a+b+z)as int:a;b=z=~/\d/?b:z};a}

ডেমো:

groovy> f([5,8,25,'*',9,6,2,'-',104,'/',4,7,'+',6,'%', 14])
Result: 8

Ungolfed:

def f(x, a=0, b='+') {                                   
    x.each {z->
        a = z =~ /\d/ ? Eval.me(a+b+z) as int : a
        b = z =~ /\d/ ? b : z
    }
    a
}

1

জিসিসি (সতর্কতা সহ) 165 (লাইন শেষ হিসাবে গণনা 1 হিসাবে)

#define A atoi(*a);break;case
o='+',s=0;main(c,a)char**a;{while(*++a)if(**a<48)o=**a;else switch(o){case'+':s+=A'-':s-=A'*':s*=A'/':s/=A'%':s%=A 0:;}printf("%d",s);}

তবে আপনি যদি এটি মিংডও 32 দিয়ে সংকলন করে থাকেন তবে আপনাকে গ্লোববিং বন্ধ করতে হবে ( https://www.cygwin.com/ml/cygwin/1999-11/msg00052.html দেখুন ) এর মতো সংকলন করে:

gcc x.c C:\Applications\mingw32\i686-w64-mingw32\lib\CRT_noglob.o

1

পার্ল 5.10+, 52 বাইট

perl -E '$o="+";/\D/?$o=$_:eval"\$x=int\$x$o$_"for@ARGV;say$x'

ডেমো:

$ perl -E '$o="+";/\D/?$o=$_:eval"\x=int\$x$o$_"for@ARGV;say$x' 5 8 25 \* 9 6 2 - 104 / 4 7 + 6 % 14
8

(মনে রাখবেন যে * আমার শেল এড়িয়ে যেতে হবে যাতে এটি গ্লোব প্যাটার্ন হিসাবে ব্যাখ্যা করা যায় না))

Ungolfed:

$o="+";                      # Start with addition
/\D/ ? $o=$_                 # If not a number, update the current operator
     : eval"\$x=int\$x$o$_"  # Otherwise, make a string like '$x=int$x+1' and eval it
for@ARGV;                    # Repeat for each item in the argument list
say$x                        # Print the result

1

সি #, 132 165 168 বাইট

এই ফাংশনটি অনুমান করে যে ইনপুটটি বৈধ। সি # এর পক্ষে এটি কঠিন, প্রদত্ত কিছু নেইeval সমতুল্য নেই।

ধন্যবাদ 33 বাইট সংরক্ষণের জন্য edc65 !

স্বচ্ছতার জন্য যুক্ত।

int C(string[]a){
    int o=1,r=0,n;
    foreach(var b in a)
        n=int.TryParse(b,out n)
            ?r=o<0?r%n
              :o<1?r*n
              :o<2?r+n
              :o<4?r-n
                  :r/n
            :o=b[0]-42;
    return r;
}

আপনি বেশিরভাগ নতুনলাইনগুলি বের করতে পারেন।
ট্রেবুচেট

আমি কোনও নতুন লাইন বা তুচ্ছ সাদা জায়গা গণনা করি নি।
হ্যান্ড-ই-ফুড

1
132 ব্যবহার করে ?:->int C(string[]a){int o=1,r=0,n;foreach(var b in a)n=int.TryParse(b,out n)?r=o<0?r%n:o<1?r*n:o<3?r+n:o<5?r-n:r/n:o=b[0]-42;return r;}
edc65

1

রুবি, 59 বাইট

a=0
o=?+
gets.split.map{|s|s=~/\d/?a=eval([a,s]*o):o=s}
p a

পরীক্ষা রান:

$ ruby calc.rb <<< "5 8 25 * 9 6 2 - 104 / 4 7 + 6 % 14"
8
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.