逆ポーランド電卓を実装してみました。
第30回Ruby/Rails勉強会に参加しました - サイログ。MiyakoとかRubyとかなんとか+Miyako ACCESS MAPより。
初級者レッスンで逆ポーランド電卓のお題が出ていたようなので、僕も実装してみました。やっぱりエラーチェックが面倒です…
def rpn(expr) result = expr.inject([]) do |stack, e| case e when :+, :-, :*, :/ raise "invalid expr." if stack.size < 2 o2 = stack.pop o1 = stack.pop raise "divided by 0." if e == :/ and o2.zero? stack.push(o1.send(e, o2)) when Integer stack.push(e) end end raise "invalid expr." unless result.size == 1 result.first end def main(args) expr = args.map do |arg| case arg when /^\d+$/ arg.to_i when '+', '-', '*', '/' arg.to_sym else raise "invalid input #{arg}." end end puts rpn(expr) end if __FILE__ == $0 # main(['1', '2', '+', '3', '4', '+', '*', '10', '-']) main(ARGV) end