如何使用递增的值来填充数组Ruby

时间:2013-01-07 05:55:32

标签: ruby arrays project

我正试图解决http://projecteuler.net/problem=1

我想创建一个方法,它接受一个整数,然后创建一个包含在它之前的所有整数的数组,并将整数本身作为数组中的值。

以下是我到目前为止的情况。代码不起作用。

def make_array(num)
  numbers = Array.new num  
  count = 1

  numbers.each do |number|
    numbers << number = count
    count = count + 1
  end

  return numbers    
end

make_array(10)

2 个答案:

答案 0 :(得分:9)

你需要在Ruby中完成

(1..num).to_a

1..num将创建一个Range对象,其开头位于1,并以任何值num结束。 Range个对象使用to_a方法通过枚举范围内的每个元素将它们炸成真实的Arrays

对于大多数用途,您实际上并不需要Array - Range可以正常使用。这包括迭代(这是我假设你想要的,考虑到你正在处理的问题)。

也就是说,知道如何手动创建这样的Array“是有价值的学习经验,所以你可能想继续努力。提示:您希望以空数组([])而不是Array.new num开头,然后迭代num.times,并将数字添加到Array。如果您已经开始使用Array大小num,然后将num元素推入其中,则最终会有两个num个元素。如果您正在迭代数组时添加元素,那么循环永远不会退出,因为对于您处理的每个元素,您都要添加另一个元素。这就像用磁铁的排斥侧追逐金属球一样。

答案 1 :(得分:2)

回答欧拉问题:

(1 ... 1000).to_a.select{|x| x%3==0 || x%5==0}.reduce(:+) # => 233168

有时,单行代码比我认为的更详细的代码更具可读性。

假设您通过ProjectEuler上的示例学习Ruby,我将解释该行的作用:

(1 ... 1000).to_a

将创建一个数字为1到999的数组.Euler-Question希望数字低于 1000.使用范围中的三个点将创建它而没有边界值本身。

.select{|x| x%3==0 || x%5==0}

仅选择可被3或5除数的元素,因此选择3或5的倍数。其他值将被丢弃。此操作的结果是一个只有3或5的倍数的新数组。

.reduce(:+)

最后,此操作会将数组中的所有数字(或将其减少)总结为一个数字:解决方案所需的总和。

我想要说明的是:您每天手工编写的许多方法已经集成在ruby中,因为它是程序员为程序员编写的语言。务实;)