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

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

おっとこれは手抜き。