简介:我发现,这里的基本问题是,您是否可以将代码块传递给
Ruby数组,这实际上会将该数组的内容减少到另一个数组,而不是单个值(注入的方式).最简洁的答案是不”.
我接受了这个说明的答案.感谢Squeegy提供了一个很好的循环策略来从阵列中获取条纹.
挑战:减少数组元素而不显式循环.
输入:从-10到10的所有整数(0除外)随机排序.
期望输出:表示正数或负数条纹的数组.例如,-3表示三个连续的负数. A 2代表两个连续的正数.
示例脚本:
original_array = (-10..10).to_a.sort{rand(3)-1} original_array.reject!{|i| i == 0} # remove zero streaks = (-1..1).to_a # this is a placeholder. # The streaks array will contain the output. # Your code goes here,hopefully without looping through the array puts "Original Array:" puts original_array.join(",") puts "Streaks:" puts streaks.join(",") puts "Streaks Sum:" puts streaks.inject{|sum,n| sum + n}
样本输出:
Original Array: 3,-4,-6,1,-10,-5,7,-8,9,-3,-7,8,10,4,2,5,-2,6,-1,-9 Streaks: 1,-2 Streaks Sum: 0 Original Array: -10,-9,3,10 Streaks: -10,10 Streaks Sum: 0
请注意以下几点:
>条纹阵列具有交替的正值和负值.
>元素条纹数组的总和始终为0(原始的总和).
>条纹数组的绝对值之和始终为20.
希望很清楚!
编辑:我确实意识到这样的结构如拒绝!实际上是在后台循环遍历数组.我不排除循环,因为我是一个卑鄙的人.只是想了解这门语言.如果需要显式迭代,那很好.
解决方法
从Ruby 1.9开始,有一种更简单的方法可以解决这个问题:
original_array.chunk{|x| x <=> 0 }.map{|a,b| a * b.size }
Enumerable.chunk将通过块的输出将数组的所有连续元素组合在一起:
>> original_array.chunk{|x| x <=> 0 } => [[1,[3]],[-1,[-4,-6]],[1,[1]],[-10,-5]],[7]],[-8]],[9]],[-3,-7]],[8,5]],[-2]],[6]],-9]]]
这几乎就是OP所要求的,除了需要计算得到的组以获得最终的条纹数组.