2014-05-12 44 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