Да, поскольку вы не вызываете flatten
во второй версии, массив слишком вложенный и выбор не работает, потому что v
- это строка элементов, а не один элемент. Однако если вы просто вызовете flatten
, как в первой версии, результирующий массив будет слишком плоским.
Есть несколько способов решить эту проблему:
- В 1.9.2 вы можете заменить внешний вызов на «map
with
flat_map which works like
map`, но автоматически создаст плоский массив.
- В 1.8.7+ вы можете вызвать
flatten(1)
вместо flatten
, что сгладит массив ровно на один уровень вложенности, в результате чего вы получите желаемую структуру.
- Вместо массива вы можете определить класс для представления числа, что устраняет проблему случайного выравнивания внутренних массивов и позволяет более осмысленно обращаться к свойствам числа.
Вариант 3 может выглядеть так:
Product = Struct.new(:factor1, :factor2) do
def product
factor1 * factor2
end
def to_s
"#{factor1} * #{factor2} = #{product}"
end
end
products = (10..14).map { |a|
(a..14).map { |b|
Product.new(a,b)
}
}.flatten.select { |prod|
prod.product.to_s == prod.product.to_s.reverse
}
puts products