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
うーん。こうなってくると本人の習熟度とか使いまわしの問題だな。