rubyで魔方陣

この実効速度に凹んだ。
15って分かってやってるからかな?
アルゴリズムもかなり練ってるからなぁ。
アルゴリズムを考える時間と実行する時間を考えるとより表現力のある言語の方がいいのかもしれない。
いやーやっぱりマシン速くなったなぁ。

rubyは1.8.7以上でないとpermutationが使えない。

x=15
(1..9).to_a.permutation(3).each{|a|
  if x==a.inject(0){|i,v|v+=i}
    (1..9).to_a.reject{|i|a.include?(i)}.permutation(3).each{|b|
      if x==b.inject(0){|i,v|v+=i}
        (1..9).to_a.reject{|i|a.include?(i)||b.include?(i)}.permutation(3).each{|c|
          if x==a[0]+b[1]+c[2] && x==a[2]+b[1]+c[0] && x==a[0]+b[0]+c[0] && x==a[1]+b[1]+c[1] && x==a[2]+b[2]+c[2]
            p [a,b,c].flatten 
          end
        }
      end
    }
  end
}
#=>real	0m0.036s
#=>user	0m0.032s
#=>sys	0m0.000s

じゃあ、xが分からないパターンで行ってみると…おお、それっぽいなprologの半分ぐらいか。
なんか何でもいいような気がしてくるな。
単に気分の問題なんだろうか。

x=0
(1..9).to_a.permutation(3).each{|a|
  x=a.inject(0){|i,v|v+=i}
  (1..9).to_a.reject{|i|a.include?(i)}.permutation(3).each{|b|
    if x==b.inject(0){|i,v|v+=i}
      (1..9).to_a.reject{|i|a.include?(i)||b.include?(i)}.permutation(3).each{|c|
        if x==a[0]+b[1]+c[2] && x==a[2]+b[1]+c[0] && x==a[0]+b[0]+c[0] && x==a[1]+b[1]+c[1] && x==a[2]+b[2]+c[2]
          p [a,b,c].flatten 
        end
      }
    end
  }
}
#=>real	0m0.226s
#=>user	0m0.220s
#=>sys	0m0.000s

うーん。こうなってくると本人の習熟度とか使いまわしの問題だな。