ハノイの塔(Ruby版)

N = ARGV[0].to_i
$s = [[],[],[]]
N.downto(1){|i| $s[0] << i }

def printstack
  puts "-----------"
  (0..2).each{|i| puts "s[#{i}]=[#{$s[i].join(",")}]" }
end

def movehanoi(f, t, d)
  puts "movehanoi(#{f}, #{t}, #{d})"
  tmp = ([0, 1, 2] - [f, t])[0]
  if d == 1 then
    $s[t] << $s[f].pop
    printstack
  else
    movehanoi(f, tmp, d-1)
    movehanoi(f, t, 1)
    movehanoi(tmp, t, d-1)
  end
end

puts "N = #{N}"
printstack
movehanoi(0, 2, N)

一時的にd-1のスタックをおきたい場所(tmp)を求める演算がPerlに比べて集合演算でさくっと求められるので楽ですね。Perlでも素敵なライブラリをuseすれば簡単にできそうですが、詳しくないので...すいません。