Ruby初学者 - 需要帮助优化此代码

hel*_*re1 4 ruby algorithm optimization enumerable

目前正在学习Ruby /编程的过程中,我遇到了这个问题:

你的任务是建造一个建筑物,它将是一堆n个立方体.底部的立方体将具有一定体积n^3,上面的立方体将具有体积(n-1)^3等等,直到顶部具有体积为1^3.您将获得m建筑物的总体积.报错m,你可以找到多少n,你将不得不建立多维数据集?函数的参数findNb(find_nb, find-nb)将是一个整数m,您必须返回整数n,n^3 + (n-1)^3 + ... + 1^3 = m如果n存在这样的整数,或者-1如果没有这样的整数n*.

这是我试图解决这个问题:

def find_nb(m)
  (1..Float::INFINITY).each do |n|
    if (1..n).inject(0) {|sum, value| sum + value**3} == m
      return p n 
    else
      next
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

这似乎适用于我知道可以工作的输入,例如:

find_nb(4183059834009)
find_nb(135440716410000)
find_nb(40539911473216)
Run Code Online (Sandbox Code Playgroud)

我需要帮助的领域:

  • 我不知道如果没有任何值n可以满足等式,因此我会如何理解它,因此输出-1如输入

    find_nb(24723578342962)
    
    Run Code Online (Sandbox Code Playgroud)
  • 任何有关如何使现有代码更好的提示将不胜感激.

Ama*_*dan 7

提示1:你不需要去无穷大:在一定程度之后n,总和将会大于m,并且会越来越远.

提示2:如果n找到,函数永远不会到达最后一行,因为return.

提示3:next如果到达each块的末尾则是自动的.

提示4:每次都不需要从头开始重新计算立方体的总和.你没有建造一座全新的建筑,只是在下面放一个更大的立方体.

所以...

def find_nb(m)
  n = 1
  sum = 1
  while sum < m
    n += 1
    sum += n**3
  end
  return sum == m ? n : -1
end
Run Code Online (Sandbox Code Playgroud)

编辑:这是一个功能版本,但我认为while上面的内容仍然更清晰(也可能更快):

def find_nb(m)
  sum = 0
  sizes = 1.upto(Float::INFINITY)
    .lazy
    .map { |n| sum += n ** 3 }
    .take_while { |x| x <= m }
    .to_a
  sizes.last == m ? sizes.length : -1
end
Run Code Online (Sandbox Code Playgroud)