我正试图解决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)
答案 0 :(得分:9)
(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中,因为它是程序员为程序员编写的语言。务实;)