# -*- coding: utf-8 -*- # http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2036 # # 条件より,2進数での1桁目は 1 であり,奇数のみが対象となる. # # 2進数でも回文数か? def palindromic_number2?(x) b = x.to_s(2).chars.to_a n = b.size (0 ... n / 2).reduce(true) do |ret, i| ret && b[i] == b[n - i - 1] end end # 条件より,回文数は10 ** 6以下なので, # 6桁までの奇数の回文数を生成して,2進数でも回文数の場合に合計する. NUMS = (0 .. 9).map(&:to_s) puts (NUMS.repeated_permutation(3).to_a + NUMS.repeated_permutation(2).to_a + NUMS.repeated_permutation(1).to_a).reduce(0) {|sum, i| if (i[-1].to_i.odd?) p1 = (i.reverse.join + i.join).to_i p2 = (i[1 .. -1].reverse.join + i.join).to_i sum + (palindromic_number2?(p1) ? p1 : 0) + (palindromic_number2?(p2) ? p2 : 0) else sum end }