这是工作代码:
p = (10..14).map { |a|
(a..14).map { |b|
a * b
}
flatten.select { |p|
p.to_s == p.to_s.reverse
}
但我想保留有关'a'和'b'的信息,这些信息会产生'a * b':
p = (10..14).map { |a|
(a..14).map { |b|
[a, b, a * b, '=']
}
}.select { |v|
v[2].to_s == v[2].to_s.reverse
}
puts p
此代码打印不是回文编号。我猜这个原因是数字平坦。如何更改代码以获得回文数?
答案 0 :(得分:7)
您只想展平一个级别,因此请改用flatten(1)
。
(10..14).map { |a|
(a..14).map { |b|
[a, b, a * b, '=']
}
}.flatten(1).select { |v|
v[2].to_s == v[2].to_s.reverse
}
或者,将map
替换为flat_map
:
(10..14).flat_map { |a|
(a..14).map { |b|
[a, b, a * b, '=']
}
}.select { |v|
v[2].to_s == v[2].to_s.reverse
}
注意:flatten
从Ruby 1.8.7开始接受一个参数。 flat_map
是Ruby 1.9.2的新功能。确保您拥有正确的版本,或require "backports/1.9.2/enumerable/flat_map"
或require "backports/1.8.7/array/flatten"
。
答案 1 :(得分:1)
是的,因为你没有在第二个版本中调用flatten
,所以数组太嵌套而select不起作用,因为v
是一行元素,而不是单个元素。但是,如果您只是在第一个版本中调用flatten
,则生成的数组将太平。
有多种方法可以解决这个问题:
with
flat_map which works like
map`,但会自动生成一个平面数组。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
答案 2 :(得分:1)
palindromes = []
(10..14).each do |a|
(a..14).each do |b|
p = (a * b).to_s
palindromes << [a,b] if p == p.reverse
end
end
puts palindromes.join(',')
wesbailey@feynman:~/code_katas> ruby palindrome.rb
11,11