Arithmetic evaluation: Difference between revisions
Content added Content deleted
m (→{{header|Sidef}}: updated code) |
|||
Line 4,875: | Line 4,875: | ||
func operate(s, op) { |
func operate(s, op) { |
||
s.split(op).map{|c| c |
s.split(op).map{|c| Number(c) }.reduce(op) |
||
} |
} |
||
func add(s) { |
func add(s) { |
||
operate(s.sub(/^\+/,'').sub(/\++/,'+'), '+') |
operate(s.sub(/^\+/,'').sub(/\++/,'+'), '+') |
||
} |
} |
||
func subtract(s) { |
func subtract(s) { |
||
s.gsub!(/(\+-|-\+)/,'-') |
s.gsub!(/(\+-|-\+)/,'-') |
||
if (s ~~ /--/) { |
if (s ~~ /--/) { |
||
return(add(s.sub(/--/,'+'))) |
return(add(s.sub(/--/,'+'))) |
||
} |
} |
||
var b = s.split('-') |
var b = s.split('-') |
||
b.len == 3 ? (-1*b[1] |
b.len == 3 ? (-1*Number(b[1]) - Number(b[2])) |
||
: operate(s, '-') |
: operate(s, '-') |
||
} |
} |
||
s.gsub!(/[()]/,'').gsub!(/-\+/, '-') |
s.gsub!(/[()]/,'').gsub!(/-\+/, '-') |
||
var reM = /\*/ |
var reM = /\*/ |
||
var reMD = %r"(\d+\.?\d*\s*[*/]\s*[+-]?\d+\.?\d*)" |
var reMD = %r"(\d+\.?\d*\s*[*/]\s*[+-]?\d+\.?\d*)" |
||
var reA = /\d\+/ |
var reA = /\d\+/ |
||
var reAS = /(-?\d+\.?\d*\s*[+-]\s*[+-]?\d+\.?\d*)/ |
var reAS = /(-?\d+\.?\d*\s*[+-]\s*[+-]?\d+\.?\d*)/ |
||
while (var match = reMD.match(s)) { |
while (var match = reMD.match(s)) { |
||
match[0] ~~ reM |
match[0] ~~ reM |
||
? s.sub!(reMD, operate(match[0], '*').to_s) |
? s.sub!(reMD, operate(match[0], '*').to_s) |
||
: s.sub!(reMD, operate(match[0], '/').to_s) |
: s.sub!(reMD, operate(match[0], '/').to_s) |
||
} |
} |
||
Line 4,911: | Line 4,911: | ||
match[0] ~~ reA |
match[0] ~~ reA |
||
? s.sub!(reAS, add(match[0]).to_s) |
? s.sub!(reAS, add(match[0]).to_s) |
||
: s.sub!(reAS, subtract(match[0]).to_s) |
: s.sub!(reAS, subtract(match[0]).to_s) |
||
} |
} |
||
return s |
return s |
||
} |
} |
||
var rePara = /(\([^\(\)]*\))/ |
var rePara = /(\([^\(\)]*\))/ |
||
s.split!.join!('').sub!(/^\+/,'') |
s.split!.join!('').sub!(/^\+/,'') |
||
while (var match = s.match(rePara)) { |
while (var match = s.match(rePara)) { |
||
s.sub!(rePara, evalExp(match[0])) |
s.sub!(rePara, evalExp(match[0])) |
||
} |
} |
||
return evalExp(s) |
return Number(evalExp(s)) |
||
}</lang> |
}</lang> |
||
Line 4,937: | Line 4,937: | ||
['2 * (3 + (4 * 5 + (6 * 7) * 8) - 9) * 10' => 7000], |
['2 * (3 + (4 * 5 + (6 * 7) * 8) - 9) * 10' => 7000], |
||
] { |
] { |
||
var num = evalArithmeticExp(expr) |
var num = evalArithmeticExp(expr) |
||
assert_eq(num, res) |
assert_eq(num, res) |
||
"%-45s == %10g\n".printf(expr, num) |
"%-45s == %10g\n".printf(expr, num) |
||
}</lang> |
}</lang> |
||