Isn't the point of math to just use numbers? Write a program that converts a mathematical expression to words, evaluates the expression, and prints how the equation would be spoken aloud.

Input


The input must only contain numbers and the symbols +, -, *, and /. There cannot be any whitespace in the input.
The input does not say what the expression is equal to.


Output


While order of operations must be followed in determining the numerical answer in the expression, it is not necessary to indicate this in the output (for this reason, the input cannot contain parentheses).
Numbers must be printed in capital letters. Operations must be printed in lower case.
Numbers must be printed in the order that they appear in the input. Then the word equals must be printed, then the answer.
Numbers in the output can be negative. The word negative is written in capital letters.
Operations and numbers must be separated by a space. There cannot be any space after the last letter is printed.
+ in the input gets converted to plus in the output. - in the input gets converted to minus in the output. * in the input gets converted to times in the output. / in the input gets converted to divided by in the output.
Division by 0 is not allowed.
When division results in a decimal, the number should be rounded to three decimal places and read X POINT X X X where the Xs are replaced by numbers.
Negative numbers should have `NEGATIVE in front of them.
For simplicity, all numbers must have absolute value less than 1000.
0 is ZERO (not NOUGHT, OH, etc).


Samples

Inputs

1+2
2-3
6*2-4/1
1+1-1*1/1
2/3
413-621


Outputs

ONE plus TWO equals THREE
TWO minus THREE equals NEGATIVE ONE
SIX times TWO minus FOUR divided by ONE equals EIGHT
ONE plus ONE minus ONE times ONE divided by ONE equals ONE
TWO divided by THREE equals ZERO POINT SIX SIX SEVEN
FOUR HUNDRED THIRTEEN minus SIX HUNDRED TWENTY-ONE equals NEGATIVE TWO HUNDRED EIGHT




This is code golf, fellas. Standard CG rules apply. Shortest code in bytes wins.
JavaScript ES6, 255 247 237 225 219 bytes

s=&gt;(s+'='+ +eval(s).toFixed(3))[h=(a,b,l)=&gt;' '+[a,...btoa(b).split`z`][l],t='replace'](/\D/g,l=&gt;h('divided by',`¶)³:eºÌæ{¬Íê®j[3¦§·&lt;`,'*+-/=.'.indexOf(l)))[t](/\d/g,l=&gt;h('ZERO',`8Ñ3Mc³LtD1NQÅ!Q3HóHED71tó4D`,l))


I'll resume golfing tomorrow. Gotta sleep :/

Base encoding may cause issues. If it does, I'll add a pastebin and possibly a hex dump.

If you find any issues (or the spec changes) don't hesitate to tell me, I'll fix it as soon as possible.

Explanation

s=&gt;     // Function with argument "s"
 (s+'='                  // Add an equal sign to the input
   + +eval(s).toFixed(3)    // Add the value of the expression rounded to 3 places
 )[h=(a,b,l)=&gt;           // Function h with args a,b, and l
                         // Return...
     ' '+                    // A space added to...
     [a,...btoa(b).split`z`] // Base decode the compressed words
     [l]                     // Grab the correct word
  ,t='replace'            // Alias replace command

 ](/\D/g,                // Replace non-digits with...
    l=&gt;h(                                   // Function h
       'divided by',`¶)³:eºÌæ{¬Íê®j[3¦§·&lt;`, // Base encoded words
       '*+-/=.'.indexOf(l)                  // Replace operator with correct word
    )

 )[t](                             // Replace again
    /\d/g,l=&gt;                      // Replaces Digits with...
      h('ZERO',`8Ñ3Mc³LtD1NQÅ!Q3HóHED71tó4D` // Base encoded words
        ,l                                   // The associated number
      )
 )