On Nov 30, 3:28 pm, Ruby Quiz <ja... / grayproductions.net> wrote: > > -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= > > There are many different ways to write mathematical equations. Infix notation > is probably the most popular and yields expressions like: > > 2 * (3 + 5) > > Some people like to work with a postfix notation (often called Reverse Polish > Notation or just RPN) though, which doesn't require parentheses for the same > equation: > > 2 3 5 + * #!/usr/bin/ruby $prec_tbl = { ['*', '+'] => true, ['*', '-'] => true, ['/', '+'] => true, ['/', '-'] => true, ['-', '-'] => true, ['/', '/'] => true } def precede?(top, op) $prec_tbl[[top, op]] end def infix(arr, top = nil) throw "invalid postfix expression" unless !arr.empty? op = arr.pop if op =~ /\+|\-|\*|\// right = infix(arr, op) left = infix(arr, op) par = precede?(top, op) (par ? "(" : "") + "#{left} #{op} #{right}" + (par ? ")" : "") else op end end STDIN.each do |line| arr = line.split(/\s+/) begin res = infix(arr) throw "invalid postfix expression" unless arr.empty? puts "#{res} => #{eval(res)}" rescue STDERR.puts $! end end -- Alex Shulgin