gpt4 book ai didi

ruby - 根据其中的条纹对 Ruby 数组进行分块

转载 作者:数据小太阳 更新时间:2023-10-29 06:51:41 24 4
gpt4 key购买 nike

总结:这里的基本问题是,我发现,您是否可以将代码块传递给 Ruby 数组,这实际上会将该数组的内容减少到另一个数组,而不是单个值(inject 的方式)。最简洁的答案是不”。

我接受这样的回答。感谢 Squeegy 提供了一个很好的循环策略来从数组中去除条纹。

挑战:在不显式循环遍历数组的情况下减少数组的元素。
输入:所有从 -10 到 10(0 除外)的整数随机排列。
The Desired Output:一个表示正数或负数条纹的数组。例如,-3 表示三个连续的负数。 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,1,-2,1,-1,1,-2,5,-1,1,-2
Streaks Sum:
0


Original Array:
-10,-9,-8,-7,-6,-5,-4,-3,-2,-1,1,2,3,4,5,6,7,8,9,10
Streaks:
-10,10
Streaks Sum:
0

注意几点:

  • streaks 数组具有交替的正值和负值。
  • 元素 streaks 数组的总和始终为 0(原始总和也是如此)。
  • streak 数组的绝对值之和始终为 20。

希望这很清楚!

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

最佳答案

好吧,这是一个单行版本,如果你更喜欢的话:

streaks = original_array.inject([]) {|a,x| (a.empty? || x * a[-1] < 0 ? a << 0 : a)[-1] += x <=> 0; a}

如果 even inject 对你来说太麻烦了,这里有一个非常愚蠢的方法:

  streaks = eval "[#{original_array.join(",").gsub(/((\-\d+,?)+|(\d+,?)+)/) {($1[0..0] == "-" ? "-" : "") + $1.split(/,/).size.to_s + ","}}]"

但我认为很明显,您最好使用更直接的方法:

streaks = []
original_array.each do |x|
xsign = (x <=> 0)
if streaks.empty? || x * streaks[-1] < 0
streaks << xsign
else
streaks[-1] += xsign
end
end

除了更容易理解和维护之外,“循环”版本的运行时间大约是注入(inject)版本的三分之二,大约是 eval/regexp 版本的六分之一。

PS:这里还有一个可能有趣的版本:

a = [[]]
original_array.each do |x|
a << [] if x * (a[-1][-1] || 0) < 0
a[-1] << x
end
streaks = a.map {|aa| (aa.first <=> 0) * aa.size}

这使用两次传递,首先构建一个条纹数组,然后将数组的数组转换为有符号大小的数组。在 Ruby 1.8.5 中,这实际上比上面的 inject 版本稍快(虽然在 Ruby 1.9 中它慢了一点),但无聊的循环仍然是最快的。

关于ruby - 根据其中的条纹对 Ruby 数组进行分块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/582615/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com