Rubyで書き直したら圧倒的に短くなった
一昨日Javaで書いたプログラムをRubyで書き直してみた。
本質的な部分はわずか3行。Arrayクラスのメソッドで順列を扱えるので圧倒的に短くなった。ただ、「上位n個を求める」機能が見つからなかったので、今回は最高値だけを記録&出力。
プログラムは以下の通り。
def calc [ 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2.0 ].permutation do |x| yield x[0] / ( (x[1]- x[2]/x[3]).abs * (x[4] - x[5]/x[6]).abs * (x[7] - x[8]/x[9]).abs) , x end end $max_value = Float::MIN calc { |value,target| $max_value,$param = value,target if value.finite? && $max_value < value } puts "best value = #$max_value expression = #{$param[0]} / (abs(#{$param[1]}-#{$param[2]}/#{$param[3]}) * abs(#{$param[4]}-#{$param[5]}/#{$param[6]}) * abs(#{$param[7]}-#{$param[8]}/#{$param[9]}))"
実行結果は以下の通り。
best value = 335999.999999998 expression = 2.0 / (abs(1.1-1.7/1.5) * abs(1.2-1.9/1.6) * abs(1.3-1.8/1.4))
計算時間はruby 1.8.7で約13.1秒。これをruby 1.9.2-p0で実行すると約4.7秒と大きく改善。
Java版(実行時間 約1.5秒)の3倍程度にまで迫っている。