在Ruby中查找回文数字

时间:2009-10-26 06:51:20

标签: ruby

所以,我正在使用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机器上唯一可用的版本。

4 个答案:

答案 0 :(得分:3)

你的这一行

array = array.map{|u| array.map{|y| u*y}}

返回一个嵌套数组,你应该解包。

提示:(但我不会告诉你如何)

  1. 您可能不需要对中间值进行排序
  2. 您需要删除重复项
  3. 提示:
    下次,在交互式解释器中运行代码,这样你就可以看到每行代码的结果。

答案 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)

This looks more understandable:-

#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