# -*- coding: utf-8 -*- # http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%204 # # 回文数判定してブルートフォースで解く… def palindromic_number?(a) # 10進数の桁数k k = (Math.log(a) / Math.log(10)).to_i + 1 if (k == 1) # 1桁なら回文数 true else # k桁の10進数は # (0 ... k).reduce{|sum,i| sum + a[i] * 10 ** i} (ただし 0 < a[i] && a[i] < 10) # で表わされる. # (0 ... k / 2)の任意のiに対して # a[i] * 10 ** i == a[k - i - 1] * 10 * (k - i - 1) # となる場合が回文数である. a = (0 ... k).map{|i| (a / 10 ** i).to_i % 10 } (0 ... (k / 2).to_i).reduce(true) do |t, i| t && (a[k - i - 1] == a[i]) end end end # 力技で解きます. puts (100 ... 1000).reduce(-1) {|m1, a| [m1, (100 ... 1000).reduce(-1) {|m2, b| palindromic_number?(a * b) ? [m2, a * b].max : m2}].max }