夏休みの宿題 -- ポーランド記法
夏休みの宿題 - ポーランド記法 - Rubyist Magazine 15号
jumius氏のにインスパイアされて正規表現だけで頑張ってみました。
a= "- + 1 / 2 2 + 3 * 4 5" 0 while a.sub!(/([^ \w]) (\d\S*) (\d\S*)/, '\2_\3_\1') p a.gsub(/_/, " ") # ==> "1 2 2 / + 3 4 5 * + -"
分かりづらっ。要するにやってるのは
irb(main):001:0> a= "- + 1 / 2 2 + 3 * 4 5" => "- + 1 / 2 2 + 3 * 4 5" irb(main):002:0> a.sub!(/([^ \w]) (\d\S*) (\d\S*)/, '\2_\3_\1') => "- + 1 2_2_/ + 3 * 4 5" irb(main):003:0> a.sub!(/([^ \w]) (\d\S*) (\d\S*)/, '\2_\3_\1') => "- 1_2_2_/_+ + 3 * 4 5" irb(main):004:0> a.sub!(/([^ \w]) (\d\S*) (\d\S*)/, '\2_\3_\1') => "- 1_2_2_/_+ + 3 4_5_*" irb(main):005:0> a.sub!(/([^ \w]) (\d\S*) (\d\S*)/, '\2_\3_\1') => "- 1_2_2_/_+ 3_4_5_*_+" irb(main):006:0> a.sub!(/([^ \w]) (\d\S*) (\d\S*)/, '\2_\3_\1') => "1_2_2_/_+_3_4_5_*_+_-" irb(main):007:0> a.sub!(/([^ \w]) (\d\S*) (\d\S*)/, '\2_\3_\1') => nil
こういうことです(分かるかな…)。
あ、逆を忘れてました。
a= "1 2 2 / + 3 4 5 * + -".reverse 0 while a.sub!(/([^ \w]) (\d\S*) (\d\S*)/, '\2_\3_\1') p a.gsub(/_/, " ").reverse # ==> "- + 1 / 2 2 + 3 * 4 5"
こんな感じで。