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

前端之家收集整理的这篇文章主要介绍了根据其中的条纹将Ruby数组块化前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
简介:我发现,这里的基本问题是,您是否可以将代码块传递给 Ruby数组,这实际上会将该数组的内容减少到另一个数组,而不是单个值(注入的方式).最简洁的答案是不”.

我接受了这个说明的答案.感谢Squeegy提供了一个很好的循环策略来从阵列中获取条纹.

挑战:减少数组元素而不显式循环.
输入:从-10到10的所有整数(0除外)随机排序.
期望输出:表示正数或负数条纹的数组.例如,-3表示三个连续的负数. A 2代表两个连续的正数.

示例脚本:

  1. original_array = (-10..10).to_a.sort{rand(3)-1}
  2. original_array.reject!{|i| i == 0} # remove zero
  3.  
  4. streaks = (-1..1).to_a # this is a placeholder.
  5. # The streaks array will contain the output.
  6. # Your code goes here,hopefully without looping through the array
  7.  
  8. puts "Original Array:"
  9. puts original_array.join(",")
  10. puts "Streaks:"
  11. puts streaks.join(",")
  12. puts "Streaks Sum:"
  13. puts streaks.inject{|sum,n| sum + n}

样本输出

  1. Original Array:
  2. 3,-4,-6,1,-10,-5,7,-8,9,-3,-7,8,10,4,2,5,-2,6,-1,-9
  3. Streaks:
  4. 1,-2
  5. Streaks Sum:
  6. 0
  7.  
  8.  
  9. Original Array:
  10. -10,-9,3,10
  11. Streaks:
  12. -10,10
  13. Streaks Sum:
  14. 0

请注意以下几点:

>条纹阵列具有交替的正值和负值.
>元素条纹数组的总和始终为0(原始的总和).
>条纹数组的绝对值之和始终为20.

希望很清楚!

编辑:我确实意识到这样的结构如拒绝!实际上是在后台循环遍历数组.我不排除循环,因为我是一个卑鄙的人.只是想了解这门语言.如果需要显式迭代,那很好.

解决方法

从Ruby 1.9开始,有一种更简单的方法可以解决这个问题:
  1. original_array.chunk{|x| x <=> 0 }.map{|a,b| a * b.size }

Enumerable.chunk将通过块的输出将数组的所有连续元素组合在一起:

  1. >> original_array.chunk{|x| x <=> 0 }
  2. => [[1,[3]],[-1,[-4,-6]],[1,[1]],[-10,-5]],[7]],[-8]],[9]],[-3,-7]],[8,5]],[-2]],[6]],-9]]]

这几乎就是OP所要求的,除了需要计算得到的组以获得最终的条纹数组.

猜你在找的Ruby相关文章