http://projecteuler.net/problem=33 全探索。少々汚いコードになった。 Fracクラスは最後の掛け算のためだけに導入。手で計算した方が早かった。 {{{#!highlight ruby #!/usr/bin/env ruby def dup(d, n) return d.to_s.chars.to_a & n.to_s.chars.to_a end class Frac attr_reader :d, :n def initialize(d, n) g = d.gcd(n) @d = d / g @n = n / g end def *(o) Frac.new(@d * o.d, @n * o.n) end def to_s "#{@d} / #{@n}" end end pseud = [] (10...100).each do |d| (d...100).each do |n| next if n == d next if n % 10 == 0 || d % 10 == 0 next if n % 11 == 0 || d % 11 == 0 cancels = dup(d, n) cancels.each do |c| _n = (n.to_s.chars.to_a - [c]).join.to_s.to_i _d = (d.to_s.chars.to_a - [c]).join.to_s.to_i pseud << Frac.new(_d, _n) if (n.to_f / d.to_f == _n.to_f / _d.to_f) end end end p pseud.inject(Frac.new(1, 1)){|acc, f| acc * f} }}}