monthly gimite

試験運用中。

夏休みの宿題 -- ポーランド記法

夏休みの宿題 - ポーランド記法 - 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"

こんな感じで。