2014-05-12 73 views
1

如何在每個塊中添加範圍元素。例如: -紅寶石在每個塊中添加範圍元素

a = [[1..10, 13..20, 21..24], [34..39, 42..45], [50..55]] 

結果:

a = [[9+7+3],[5+3],[5]] 
a = [20, 8, 5] 
+0

爲什麼'1..10'等於10,但'13..20'等於7?後者應該是8個IMO。 。 。 ?但是,除了1..10之外,你對這一切始終如一? –

+0

對不起,我改變了它。它應該是10-1,20-13等。 – Mark

+0

所以你想總和1小於每個範圍的條目數? –

回答

3

您可以通過相應的firstlast方法來訪問一個範圍的第一個和最後一個元素。 inject(:+)總計屬於同一組的所有範圍的部分距離。

a.map { |ran­ges| range­s.map { |rang­e| range­.last - range­.first }.inj­ect(:+) } 
=> [19, 8, 5] 

或者,甚至更短,如通過使用紅寶石2.0 tokland建議:

a.map { |ran­ges| range­s.map(&:size).reduce(0, :+) } 
0

Range類有一個叫做#size方法。因此,我們可以做的是:

a.map { |ranges| ranges.inject(0) { |sum,rng| sum + rng.size - 1 } } 
1

紅寶石2.0:

a.map { |ranges| ranges.map { |r| r.size - 1 } .reduce(0, :+) } 
+0

這並沒有給出預期的結果 – Santhosh

+0

@Santosh:fixed – tokland