最終更新: 2011-02-03T09:33+0900
愚直に。
divisors = [17, 13, 11, 7, 5, 3, 2, 1] candidates = [] div = divisors.shift div.step(999, div){|x| triplet = [x/100, x/10%10, x%10] candidates.push triplet if triplet.uniq!.nil? } until divisors.empty? div = divisors.shift candidates.size.times{ candidate = candidates.shift (0..9).each{|d| if ! candidate.include?(d) && 0 == (100*d + 10*candidate[0] + candidate[1]) % div candidates.push [d] + candidate end } } end candidates.reject!{|c| c[0] == 0 } p candidates.inject(0){|sum,c| sum + c.join("").to_i }
最初に出てきた数字を書いたら通ったけど……。pentagonal numbersの名前の由来もわからんもんね。
_5 = [1] # [P1, P2,...] _5_index = {1=>0} # 逆引き(Pn=>n-1)辞書 loop{ i = _5.size _5.push(_5.last + 3*i + 1) _5_index[_5[i]] = i print "." (i-1).downto(0){|j| diff = _5[i] - _5[j] break if diff > _5[j] k = _5_index[diff] next unless k diff2 = _5[j] - _5[k] l = _5_index[diff2] next unless l puts puts "D=#{_5[j]-_5[k]}" puts "#{_5[j]-_5[k]} = P#{j+1}-P#{k+1}" puts "#{_5[l]} = P#{l+1}" puts "#{_5[j]+_5[k]} = P#{j+1}+P#{k+1}" print "#{_5[i]} = P#{i+1}" gets } }