最終更新: 2011-08-20T02:12+0900
incorrect
Target = 2_000_000 Size = Math.sqrt(Target*2).floor+1 a = (1..Size).map{|i| i*(i+1)/2 } answer = 0 until a.empty? jv = a.last answer = [a.map{|iv| iv*jv }.min_by{|v| (v-Target).abs }, answer].min_by{|v| (v-Target).abs } a.pop end p answer
まったく恥ずかしい。答えが合わないとなって当然問題を読み直してはいたんだけど、日を置いて改めて読んでみたら問題が何を求めてるのかが見えてきた。"nearest solution" ではなく "area" だったとさ。
Target = 2_000_000 Size = Math.sqrt(Target*2).floor+1 a = (1..Size).to_a answer = [0,0] until a.empty? j = a.last answer = ([answer] + a.map{|i| [i,j] }).min_by{|i,j| (i*(i+1)/2*j*(j+1)/2 - Target).abs } a.pop end puts "#{answer[0]} * #{answer[1]} = #{answer[0]*answer[1]}"