String#rpn

http://uk-studio.net/2007/12/01/ruby_rpn_ujihisa_sixeight/
ぱっと見さらに縮みそうなので Ruby の練習にやってみる。

class String
  def rpn
    scan(/-?\d+|\S+/).inject([]){|s, t|
      s << (t =~ /\d+/ ? t.to_i : eval("%s#{t}#{s.pop}" % s.pop))
    }[0]
  end
end

正規表現トークンに分けたあとさらに正規表現で判定してるのがイケテナイ。

class String
  def rpn
    scan(/-?\d+|\S+/).inject([]){|s, t|
      s << (0.respond_to?(t) ? eval("%s#{t}#{s.pop}" % s.pop) : t.to_i)
    }[0]
  end
end

こうすればいいのか。