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.to_num }.reduce(op);
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].to_num - b[2].to_num)
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).to_num;
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>