2014-04-19 39 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'也非常好。 –