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
こうすればいいのか。