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