-3
\$\begingroup\$

Your task is to create an interpreter for a calculator. It has to parse commands like 5 + 5 and return the answer.

It has to be able to add, subtract, multiply, and divide. The interpreter only needs to accept two numbers (ex. 9 * 5 and 3 + 3)

The interpreter will take input from a console/whatever, not a file.

Eval isn't allowed


Examples:

Input: 5 * 5

Output: 25


Input: 8 / 2

Output: 4


Bonus

If you're really bored you can add these to the interpreter, if you'd like:

Simple mathematical functions like sqrt.

Make the interpreter be able to accept more than two numbers (ex. 55 + 55)

\$\endgroup\$

closed as unclear what you're asking by Sp3000, El'endia Starman, Calvin's Hobbies, undergroundmonorail, Downgoat Oct 6 '15 at 5:45

Please clarify your specific problem or add additional details to highlight exactly what you need. As it's currently written, it’s hard to tell exactly what you're asking. See the How to Ask page for help clarifying this question. If this question can be reworded to fit the rules in the help center, please edit the question.

  • 1
    \$\begingroup\$ Only cursory check, but duplicate? codegolf.stackexchange.com/questions/568/basic-calculator If not, I think you should quantify the bonus. \$\endgroup\$ – cole Oct 6 '15 at 4:47
  • \$\begingroup\$ I'd almost say this is a dupe of this challenge, but at the same time I feel that accepting only two numbers might make a difference. Either way, even if this isn't a dupe, the spec needs a bit more fleshing out: 1) Is eval allowed? 2) Can numbers be more than one digit? \$\endgroup\$ – Sp3000 Oct 6 '15 at 4:48
  • 1
    \$\begingroup\$ What should 8 / 3 print? \$\endgroup\$ – Dennis Oct 6 '15 at 4:54
  • \$\begingroup\$ Does the bonus have a byte value/% taken off the byte count? \$\endgroup\$ – lirtosiast Oct 6 '15 at 5:02
  • \$\begingroup\$ By the way, we have a Sandbox where you can post challenge ideas to get feedback from communinity before "going live". \$\endgroup\$ – Dennis Oct 6 '15 at 5:20
2
\$\begingroup\$

Pyth, 1 byte

Q

For some reason, multiplication and division don't work in the online interpreter. The Python interpreter behaves as expected.

\$\endgroup\$
2
\$\begingroup\$

Perl, 10 8 chars

I hope this is not cheating ;)

8 chars (7 chars code + 1 for -p): Thanks to Dennis

perl -pe '$_=eval'

10 chars:

say eval<>

Takes input from STDIN and needs perl v5.10 and above.

\$\endgroup\$
2
\$\begingroup\$

><>, 14 Bytes

Thanks @Sp3000 for saving 2 bytes

Quick, but kinda cool solution. Probably not an ideal golf, but utilizes an interesting feature of ><>.

<v ip02ii
n<,;

Receives input through the numerical interpretation of ascii characters (i.e. a is 97). It places the second character read (the operator) in the space after <v. Because dividing in ><> uses ,, not /, I make use of the fact that / reflects the pointer to accommodate for that case.

Alternate solution if that's invalid (+4 Bytes):

<v %cip02i%ci
n<,;

For this we just take mod 12 (c pushes 12) of the input since 0 is 48 and there are only 10 characters.

If , could be used in place of /, this would be a lot shorter (something like ii60pi n; or ic%ia0pic% n;)

Golf suggestions gladly welcome -- I'm rather tired right now.

\$\endgroup\$
  • \$\begingroup\$ I'm still not sure whether the OP intended to allow eval-like submissions, but in any case the last line can just be n<,; \$\endgroup\$ – Sp3000 Oct 6 '15 at 5:24
2
\$\begingroup\$

JavaScript ES6, 10 4 bytes

Anonymous function.

eval
\$\endgroup\$
  • 2
    \$\begingroup\$ eval is already assignable (e.g., f=eval), so I think you can claim a 4 byte solution. \$\endgroup\$ – Dennis Oct 6 '15 at 5:05
0
\$\begingroup\$

MATLAB, 4 bytes (or 0 bytes)

eval s

Pretty simple really. MATLAB will evaluate the string s you pass it, and voila. For example the following operators work: * / + - ^ sqrt() min() max(). Well pretty much anything that you can think of.

Heck you can even print Hello World! if you want - eval 'disp(''Hello World!'')'.

To be honest given that MATLAB is already a calculator, you can call it 0 if you omit eval and simply type in the string:

>> 8/2
ans =
     4
\$\endgroup\$

Not the answer you're looking for? Browse other questions tagged or ask your own question.