fork download
  1. def f(s)
  2. b = ->op, a, b {op.to_proc.(a.to_i, b.to_i).to_s}
  3. s = s.dup
  4. loop do
  5. next if s.sub!(/\(([^\(\)]*)\)/) {f $1}
  6. next if s.sub!(/(-?\d+)\*(-?\d+)/) {b.(:*, $1, $2)}
  7. next if s.sub!(/(-?\d+)\/(-?\d+)/) {b.(:/, $1, $2)}
  8. next if s.sub!(/(-?\d+)\+(-?\d+)/) {b.(:+, $1, $2)}
  9. next if s.sub!(/(-?\d+)-(-?\d+)/) {b.(:-, $1, $2)}
  10. break s
  11. end
  12. end
  13. 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)]}
  14.  
Success #stdin #stdout 0s 28224KB
stdin
Standard input is empty
stdout
[["1+2+3+4", "10"], ["4+5*6-2*3", "28"], ["5+12*(2+9/3)/((2+3)*5-7*3)", "20"]]