RosettaCodeData/Task/Arithmetic-evaluation/Sidef/arithmetic-evaluation-1.sidef

57 lines
1.3 KiB
Text
Raw Permalink Normal View History

2016-12-05 23:44:36 +01:00
func evalArithmeticExp(s) {
func evalExp(s) {
func operate(s, op) {
2017-09-23 10:01:46 +02:00
s.split(op).map{|c| Number(c) }.reduce(op)
2016-12-05 23:44:36 +01:00
}
func add(s) {
2017-09-23 10:01:46 +02:00
operate(s.sub(/^\+/,'').sub(/\++/,'+'), '+')
2016-12-05 23:44:36 +01:00
}
func subtract(s) {
2017-09-23 10:01:46 +02:00
s.gsub!(/(\+-|-\+)/,'-')
2016-12-05 23:44:36 +01:00
if (s ~~ /--/) {
2017-09-23 10:01:46 +02:00
return(add(s.sub(/--/,'+')))
2016-12-05 23:44:36 +01:00
}
2017-09-23 10:01:46 +02:00
var b = s.split('-')
b.len == 3 ? (-1*Number(b[1]) - Number(b[2]))
: operate(s, '-')
2016-12-05 23:44:36 +01:00
}
2017-09-23 10:01:46 +02:00
s.gsub!(/[()]/,'').gsub!(/-\+/, '-')
2016-12-05 23:44:36 +01:00
2017-09-23 10:01:46 +02:00
var reM = /\*/
var reMD = %r"(\d+\.?\d*\s*[*/]\s*[+-]?\d+\.?\d*)"
2016-12-05 23:44:36 +01:00
2017-09-23 10:01:46 +02:00
var reA = /\d\+/
var reAS = /(-?\d+\.?\d*\s*[+-]\s*[+-]?\d+\.?\d*)/
2016-12-05 23:44:36 +01:00
while (var match = reMD.match(s)) {
match[0] ~~ reM
? s.sub!(reMD, operate(match[0], '*').to_s)
2017-09-23 10:01:46 +02:00
: s.sub!(reMD, operate(match[0], '/').to_s)
2016-12-05 23:44:36 +01:00
}
while (var match = reAS.match(s)) {
match[0] ~~ reA
? s.sub!(reAS, add(match[0]).to_s)
2017-09-23 10:01:46 +02:00
: s.sub!(reAS, subtract(match[0]).to_s)
2016-12-05 23:44:36 +01:00
}
2017-09-23 10:01:46 +02:00
return s
2016-12-05 23:44:36 +01:00
}
2017-09-23 10:01:46 +02:00
var rePara = /(\([^\(\)]*\))/
s.split!.join!('').sub!(/^\+/,'')
2016-12-05 23:44:36 +01:00
while (var match = s.match(rePara)) {
2017-09-23 10:01:46 +02:00
s.sub!(rePara, evalExp(match[0]))
2016-12-05 23:44:36 +01:00
}
2017-09-23 10:01:46 +02:00
return Number(evalExp(s))
2016-12-05 23:44:36 +01:00
}