项目欧拉:谜语4 - 我的Ruby代码在做什么?

时间:2012-12-06 00:34:44

标签: ruby

要求解决这个谜题。

所以,我正在使用Ruby解决Project Euler问题。

我用以下方法制作了一个回文检查器:

def is_palindrome(n)
  if n.to_s == n.to_s.reverse
      true
  else
      false
  end
end

使用这个,我使用下一个方法尝试找到用两个3位数字组成的最大回文。

x = 999
y = 998

while y > 100
  if is_palindrome(x * y) == true
    puts (x * y)
  else
    x-=1
    y-=1
  end
end

结果是终端完全符合并且卡在289982上并且必须是Ctrl + C才能停止。

正如我所说,我并不是在寻找这个谜语的解决方案,但我想知道我的代码是为了实现这个目的而做的。我还在学习,所以我的代码可能会相当丑陋,所以额外的业力指向可以帮助我解决这个问题的任何人。

4 个答案:

答案 0 :(得分:4)

如果发现了回文,则不会递减变量。由于变量保持不变,因此再次发现相同的回文。它就这样......

答案 1 :(得分:4)

Amadan解决了你的问题,所以我会去寻找额外的业力点:)

首先,您可以if something代替if something == true

此外,您无需执行

if something == something_else
  true
else
  false
end

因为==运算符已经返回truefalse,所以您的is_palindrome方法可能就像

一样简单
def is_palindrome(n)
  n.to_s == n.to_s.reverse
end

另外,在Ruby中,你通常会看到像这样的方法(一个布尔检查),最后以问号命名,因为它真的像你问它是/否问题!所以通常你会看到名为is_palindrome?(n)的人。您可能在其他地方看到的类似内容有Array#empty?Hash#has_key?(k)

答案 2 :(得分:2)

没有回答你的问题,但你对布尔的使用是可怕的。记住布尔表达式返回一个布尔本身,你不需要另一个比较。即。

def is_palindrome(n)
  if n.to_s == n.to_s.reverse
      true
  else
      false
  end
end

应该是:

def is_palindrome(n)
  n.to_s == n.to_s.reverse
end

并且

while y > 100
  if is_palindrome(x * y) == true

应该是

while y > 100
  if is_palindrome(x * y)

答案 3 :(得分:1)

这是我的解决方案:

# Find largest palindrome made from the product of two 3-digit numbers

largest = 0
for i in 100..999
  for j in i..999
    product = j*i
    # Check for palindrome and determine largest
    largest = product.to_s == product.to_s.reverse && product > largest ? product : largest
  end
end
p largest