Project Euler Problem 9
def comb(*enums, &block) comb2(enums, 0, [], &block) end def comb2(enums, index, params, &block) return block.call(*params) if index >= enums.size enums[index].each do |x| params << x comb2(enums, index + 1, params, &block) params.pop end end def f ans = [] comb(1 .. 998, 1 .. 998) do |a, b| c = 1000 - a - b next unless a <= b next unless a ** 2 + b ** 2 == c ** 2 ans << a * b * c end ans end p f