def f(s)
b = ->op, a, b {op.to_proc.(a.to_i, b.to_i).to_s}
s = s.dup
loop do
next if s.sub!(/\(([^\(\)]*)\)/) {f $1}
next if s.sub!(/(-?\d+)\*(-?\d+)/) {b.(:*, $1, $2)}
next if s.sub!(/(-?\d+)\/(-?\d+)/) {b.(:/, $1, $2)}
next if s.sub!(/(-?\d+)\+(-?\d+)/) {b.(:+, $1, $2)}
next if s.sub!(/(-?\d+)-(-?\d+)/) {b.(:-, $1, $2)}
break s
end
end
p ['1+2+3+4', '4+5*6-2*3', '5+12*(2+9/3)/((2+3)*5-7*3)'].map {|s| [s, f(s)]}
ZGVmIGYocykKICBiID0gLT5vcCwgYSwgYiB7b3AudG9fcHJvYy4oYS50b19pLCBiLnRvX2kpLnRvX3N9CiAgcyA9IHMuZHVwCiAgbG9vcCBkbwogICAgbmV4dCBpZiBzLnN1YiEoL1woKFteXChcKV0qKVwpLykge2YgJDF9CiAgICBuZXh0IGlmIHMuc3ViISgvKC0/XGQrKVwqKC0/XGQrKS8pIHtiLig6KiwgJDEsICQyKX0KICAgIG5leHQgaWYgcy5zdWIhKC8oLT9cZCspXC8oLT9cZCspLykge2IuKDovLCAkMSwgJDIpfQogICAgbmV4dCBpZiBzLnN1YiEoLygtP1xkKylcKygtP1xkKykvKSB7Yi4oOissICQxLCAkMil9CiAgICBuZXh0IGlmIHMuc3ViISgvKC0/XGQrKS0oLT9cZCspLykge2IuKDotLCAkMSwgJDIpfQogICAgYnJlYWsgcwogIGVuZAplbmQKcCBbJzErMiszKzQnLCAnNCs1KjYtMiozJywgJzUrMTIqKDIrOS8zKS8oKDIrMykqNS03KjMpJ10ubWFwIHt8c3wgW3MsIGYocyldfQo=