# -*- coding: utf-8 -*- # http://odz.sakura.ne.jp/projecteuler/index.php?cmd=read&page=Problem%2032 # # 1..9の数字で # a * b = c # が成り立つ組み合わせを数える. # 9桁全て使えるのは # 2桁 * 3桁 = 4桁 # 1桁 * 4桁 = 4桁 # の場合だけなので,この桁数の組み合わせの範囲で探索する. # NUMS = %w(1 2 3 4 5 6 7 8 9) # a * b = c # で重複せず9桁全て使っている場合に c を返す. def c(a, b) c = a.join.to_i * b.join.to_i abc = (a + b + c.to_s.chars.to_a) (abc.size == 9 && abc.uniq.size == 9 && !abc.include?("0")) ? c : nil end puts (# 2桁 * 3桁 NUMS.permutation(2).map {|a| (NUMS - a).permutation(3).map {|b| c(a, b) }} + # 1桁 * 4桁 NUMS.permutation(1).map {|a| (NUMS - a).permutation(4).map {|b| c(a, b) }} ).flatten.reject{|v| v.nil?}.uniq.reduce(:+)