如何在每个块中添加范围元素。例如: -红宝石在每个块中添加范围元素
a = [[1..10, 13..20, 21..24], [34..39, 42..45], [50..55]]
结果:
a = [[9+7+3],[5+3],[5]]
a = [20, 8, 5]
如何在每个块中添加范围元素。例如: -红宝石在每个块中添加范围元素
a = [[1..10, 13..20, 21..24], [34..39, 42..45], [50..55]]
结果:
a = [[9+7+3],[5+3],[5]]
a = [20, 8, 5]
您可以通过相应的first
和last
方法来访问一个范围的第一个和最后一个元素。 inject(:+)
总计属于同一组的所有范围的部分距离。
a.map { |ranges| ranges.map { |range| range.last - range.first }.inject(:+) }
=> [19, 8, 5]
或者,甚至更短,如通过使用红宝石2.0 tokland建议:
a.map { |ranges| ranges.map(&:size).reduce(0, :+) }
Range
类有一个叫做#size
方法。因此,我们可以做的是:
a.map { |ranges| ranges.inject(0) { |sum,rng| sum + rng.size - 1 } }
为什么'1..10'等于10,但'13..20'等于7?后者应该是8个IMO。 。 。 ?但是,除了1..10之外,你对这一切始终如一? –
对不起,我改变了它。它应该是10-1,20-13等。 – Mark
所以你想总和1小于每个范围的条目数? –