Begin forwarded message: > From: "Jim Truher" <jtruher / gmail.com> > Date: December 4, 2007 12:56:13 AM CST > To: submission / rubyquiz.com > Subject: Please Forward: Ruby Quiz Submission (#148) > > Good quiz this week, I had time to do it! Looks like I wasn't the > only one, either. Some reasonably graceful error handling if your > operator/operand count is off. > > #Ruby quiz #148 > require 'pp' > > class Quiz148 > > def initialize(str) > @regexed_string = str.scan(/\d+\.\d*|[-*+\/]|\d*/) > @regexed_string.reject! {|i| i == "" } > @num_stack = [] > > postfix_to_infix > end > > def postfix_to_infix > @regexed_string.each do |c| > case c > when "*" > if check_validity > one,two = eval_parens(@num_stack.pop), @num_stack.pop > @num_stack.push(two + c +one) > end > when "/" > if check_validity > one,two = eval_parens(@num_stack.pop), eval_parens > (@num_stack.pop) > @num_stack.push(two + c +one) > end > when "+", "-" > if check_validity > one,two = @num_stack.pop, @num_stack.pop > @num_stack.push(two + c + one) > end > else # - we've got a number! > @num_stack.push(c) > end # - case c > end # - @regexed_string.each do |c| > end > > def eval_parens(str) > if (str.include? "*") || (str.include? "+") || (str.include? > "-") || (str.include? "/") > "(" + str + ")" > else > str > end > end > > def check_validity > if @num_stack.size == 1 > puts "Oh no, looks like your expression has too many > operators?! Breaking early!" > return false > end > return true > end > > def to_s > if @num_stack.size > 1 > puts "Looks like your expression has too many operands : > ( Gonna just print what we've got" > end > @num_stack.first.to_s > end > end > #A few tests! > if ARGV[0] > puts Quiz148.new(ARGV[0]).to_s > end > puts Quiz148.new("56 34 213.7 + * 678 - +").to_s > puts Quiz148.new("3 5 * 5 8 * /").to_s > puts Quiz148.new("3 5 * 5 ").to_s