所以,我正在使用Project Euler来巩固我的Ruby技能。我遇到问题#4,其中包括:
回文编号读取相同的内容 双向。最大的回文制作 从两个2位数的产品 数字是9009 = 91 * 99。
找到最大的回文组织 两个3位数的乘积。
首先,我正在尝试使用第一段中的信息验证我的代码。我已经定义了一个回文函数:
def palindrome?(blah)
string = blah.to_s
string.reverse == string
end
我的代码如下:
array = (90..99).to_a
array = array.map{|u| array.map{|y| u*y}}
array = array.sort
array = array.select{|u| palindrome?(u)}
puts array
程序不输出任何内容。如果我执行以下操作:
array = (90..99).to_a
array = array.map{|u| array.map{|y| u*y}}
array = array.sort
#array = array.select{|u| palindrome?(u)}
puts array
我得到一系列未分类的四位数字,所以我猜它忽略了那种。最后,如果我只是这样做:
#array = (90..99).to_a
#array = array.map{|u| array.map{|y| u*y}}
#array = array.sort
array = [7447, 9009, 3551, 2419]
array = array.select{|u| palindrome?(u)}
puts array
我得到7447和9009,就像我应该的那样。为什么会这样?
我正在使用1.8.6,因为这是此Windows机器上唯一可用的版本。
答案 0 :(得分:3)
你的这一行
array = array.map{|u| array.map{|y| u*y}}
返回一个嵌套数组,你应该解包。
提示:(但我不会告诉你如何)
提示:
下次,在交互式解释器中运行代码,这样你就可以看到每行代码的结果。
答案 1 :(得分:2)
你可以使用这样的东西
new_arr = array.inject([]) { |a,u| a += array.map { |y| u*y } }
而不是
array = array.map{|u| array.map{|y| u*y}}
它返回一个嵌套的“[[8100,..],[],[]]”类型的数组。这就是你的代码不起作用的原因
答案 2 :(得分:1)
#Steps
# Define a method for palindrome
# List out all 3-digit numbers
# Multiply each numbers by each numbers
# List out all palindrome numbers
# Choose the largest (max) palindrome number
def is_a_palindrome?(n)
n == n.to_s.reverse.to_i
end
def problem_four
palindrome = [ ]
array = 111.upto(999)
array.each do |x|
array.each do |y|
multiply = x * y
if is_a_palindrome?(multiply)
palindrome << multiply
end
end
end
palindrome.max
end
puts problem_four
#$ ruby problem_four.rb
#906609
答案 3 :(得分:0)
找出由两个3位数字的乘积制成的最大回文。
我已经提出了这个解决方案,我希望这会对一些新手有所帮助
to=999
from=100
palindromes=[]
for i in from..to do
for j in 1..to do
k=i*j
palindromes << k if k.to_s==k.to_s.reverse
end
end
palindromes.max #this will return 906609