संख्या और ऑपरेटरों की सूची के रूप में एक कैलकुलेटर


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 के बजाय -inf की ओर गोल?
माल्टीसेन

@ मैलेटेन: आपकी भाषा जो भी करती है।
ट्रेबुचेट

3
क्या इनपुट से पूर्णांक ऋणात्मक हो सकते हैं?
डेनिस

अंक 3 और 6 एक दूसरे के विपरीत हैं: सी और अधिकांश भाषाओं में, पूर्णांक विभाजन फर्श के बजाय शून्य की ओर गोल होता है।
पीटर टेलर

यह इसी तरह की एक और चुनौती को देखना दिलचस्प होगा, लेकिन इसमें कोष्ठक पूर्वता भी शामिल है ...
जोशपब्रॉन

जवाबों:


6

पायथ - 24 23 22 20 बाइट्स

2 बाइट्स @issacg की बदौलत और 1 @orlp की बदौलत बच गए!

स्ट्रिंग बनाम इंट का पता लगाने के लिए repr में होने के 0लिए और बेस के चेक के साथ उपयोग को कम करता है '

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

ऑनलाइन काम नहीं करता क्योंकि मैं पूर्ण निष्कासन का उपयोग करता हूं जो सुरक्षा कारणों से ऑनलाइन अक्षम है। एक सूची में स्टडिन से इनपुट लेता है जैसे 5, 8, 25, "*", 9, 6, 2, "-", 104, "/", 4, 7, "+", 6:।


आप स्विच करके 2 बाइट्स बचा सकते हैं ?करने के लिए .xहै, क्योंकि केवल कुछ और ब्लॉक एक अपवाद फेंक कर सकते हैं और यह हर बार ऐसा ही करेगा। आप K, हालांकि, अब और उपयोग नहीं कर सकते । u.xsv++GbH&=bHG+\+QZ, विशेष रूप से।
isaacg

6

जावास्क्रिप्ट (ईएस 6) 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)?
Glen O

@ गेलो मुझे नहीं पता कि मैंने उसे कैसे नहीं पकड़ा। : / धन्यवाद, निश्चित।
एलेक्स ए।

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

... और ~~ बजाय parseInt ( codegolf.stackexchange.com/a/2788/21348 )
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's) 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
AdmBorkBork

3

जीएनयू सैड (निकासी विस्तार के साथ, + डीसी), 102

(स्कोर में -r विकल्प के लिए sed में +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

पायथन 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
माल्टीसेन

भी, क्यों में `अगर परेंस?
माल्टीसेन

@ माल्टीसेन हूप्स, मैं भूल गया कि अगर मुझे इस कथन में कोष्ठक की आवश्यकता नहीं है। धन्यवाद। मुझे नहीं लगता कि // 1 का उपयोग करने की अनुमति दी जाएगी, हालांकि मैंने इसका उपयोग करने के लिए नहीं सोचा था, क्योंकि यह एक अनुगामी 0 (जैसे 10.0) को छोड़ने के लिए लगता है, जो मुझे नहीं लगता कि अनुमति है।
कोल

मुझे नहीं लगता कि आपको उस स्थान inऔर बोली के बीच की आवश्यकता है ।
माल्टसेन

आप कुछ बाइट्स को यह मानकर बचा सकते हैं कि सूची फ़ंक्शन तर्कों में पास हो गई है और छुटकारा पा रही है .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

gcc (चेतावनियों के साथ) 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);}

लेकिन अगर आप इसे mingw32 के साथ संकलित कर रहे हैं तो आपको ग्लोबिंग को बंद करने की जरूरत है (देखें 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 बाइट्स

यह फ़ंक्शन मानता है कि इनपुट वैध है। यह C # के लिए कठिन है क्योंकि वहां कोई नहीं हैeval समानता है।

धन्यवाद edc6533 बाइट बचाने के लिए !

स्पष्टता के लिए प्रस्तुत।

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