根据其中的条纹将Ruby数组块化

前端之家收集整理的这篇文章主要介绍了根据其中的条纹将Ruby数组块化前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
简介:我发现,这里的基本问题是,您是否可以将代码块传递给 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所要求的,除了需要计算得到的组以获得最终的条纹数组.

猜你在找的Ruby相关文章