Альтернатива Ruby без форсирования одинаковых диапазонов:
>> (1..10).to_a.product((1..10).to_a, (1..10).to_a).select { |a, b, c| a*a + b*b == c*c }
#=> [[3, 4, 5], [4, 3, 5], [6, 8, 10], [8, 6, 10]]
Вы можете утверждать, что это не возвращает ожидаемый результат, потому что вы используете c-> b-> a для итерации, но возвращаете (a,До нашей эры).Поэтому я боюсь, что в Ruby, не имея списков, нам нужно сделать что-то вроде этого (map_select = map + compact):
>> (1..10).to_a.product((1..10).to_a, (1..10).to_a).map { |c, b, a| [a, b, c] if a*a + b*b == c*c }.compact
#=> [[4, 3, 5], [3, 4, 5], [8, 6, 10], [6, 8, 10]]
Не ванильный Ruby, а использование классной библиотеки lazylist Вы можете написать:
>> list { [a, b, c] }.where(:c => (1..10), :b => (1..10), :a => (1..10)) { a*a + b*b == c*c }.to_a
#=> [[4, 3, 5], [3, 4, 5], [8, 6, 10], [6, 8, 10]]