2014-04-19 40 views
-2

我有一个方法,将数组(数组)的对角线相加。其工作原理如下(假设中间有1值,这就是为什么在1月底被删除...):如何用惯用的红宝石方法重写方法

def sum_diagonals(grid) 
    sum = 0 
    0.upto(grid.size-1) do |i| 
    sum += grid[i][i] 
    sum += grid[i][grid.size-1-i] 
    end 
    sum-1 
end 

现在我想用一个代码块改写这个更Ruby的方式在一条线上。我尝试的东西如下:

def sum_diagonals(grid) 
    (0..grid.size-1).inject(0) {|acc, i| acc += grid[i][i] + grid[i][grid-1-i] } 
end 

但它说没有将FixNum隐式转换为数组。我知道被计数双倍的1或中间值将被计数两次。但是忽略了我想重写这个方法。有人能告诉我如何优雅地做到这一点?

+0

网格类统计员其对角线可能会更像红宝石像 – Stefan

+0

@Stefan你可以解释如何使用枚举器来创建一个网格类S' –

回答

3

发生了误差,因为你试图索引的数组的数组所以更改

(0..grid.size-1).inject(0) {|acc, i| acc += grid[i][i] + grid[i][grid-1-i] }

到:

(0..grid.size-1).inject(0) {|acc, i| acc += grid[i][i] + grid[i][grid.size-1-i] }

2
def sum_diagonals2(grid) 
    grid.each_index.inject{|acc, i| acc + grid[i][i] + grid[i][-1 - i]} 
end 
+2

是的,“acc + = ..'不需要。它是(任务)隐含。+1 –

+0

谢谢,但它不起作用。提供一半尺寸。 –

+0

'-1-i'而不是'size -1-i'也非常好。 –