夏休みの宿題 − ポーランド記法
夏休みの宿題 -- ポーランド記法 (Rubyist Magazine 0015号)
すなおに書いてみたつもりです。ポーランド記法から逆ポーランド記法へ変換します。
def p2rp(i); return i.shift if i[0]=~/^\d/; a=i.shift; b=p2rp(i); c=p2rp(i); [b,c,a].flatten; end p p2rp('- + 1 / 2 2 + 3 * 4 5'.split).join(' ') # => "1 2 2 / + 3 4 5 * + -"
整形して書くとこう。
def p2rp(i) return i.shift if i[0]=~/^\d/ a=i.shift b=p2rp(i) c=p2rp(i) [b,c,a].flatten end p p2rp('- + 1 / 2 2 + 3 * 4 5'.split).join(' ') # => "1 2 2 / + 3 4 5 * + -"
日本語で書くと「数字はそのまま、それ以外(記号)はそれにつづく2つの式のあとに記号を出力」という感じ。整理するともうすこし短く書けるようです。
個人的には、読みやすい、理解しやすい、コードが好きです。それを言うなら、引数のiを破壊的メソッドshiftで破壊しながら動作する仕様はあまり好ましくないわけですが(^^ゞ
^jumius^さんやGimiteさんのは頭の体操として好きです。
さて、逆変換はこうなります。
def rp2p(i); p2rp(i.reverse).reverse; end
おっとこれは手抜き。