# -*- coding: utf-8 -*- # http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2040 # # d_nを普通に作る.. # # 1, 2 .. 9, 10, 11 .. 99, 100, 101 .. 999, 1000, 1001 # と数字の桁数 k は # (10 ** k - (10 ** (k - 1))) # ごとに 1 増えるので,その周期で増やしながら指定桁の位置を探す. # def d(n) i = 0 k = 1 loop do # k 桁の数字のインクリメント (10 ** k - (10 ** (k - 1))).times do |j| if (i < n) i += k else # nが位置する数字 num = (10 ** (k - 1) -1) + j # nの文字位置(右から) c = i - n return num.to_s.chars.to_a.reverse[c].to_i end end # 桁が増える k += 1 end end # 解答 puts (0 .. 6).map{|i| d(10 ** i) }.reduce(:*)