根据其中的条纹将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所要求的,除了需要计算得到的组以获得最终的条纹数组.

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...