gpt4 book ai didi

ruby - 有没有办法在 Ruby 中指定一个多步骤?

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

我正在处理一些惰性迭代,并希望能够为此迭代指定多个步骤。这意味着我希望该步骤在 ab 之间交替。所以,如果我把它作为一个范围(不是懒惰只是为了简化)

(1..20).step(2, 4)

我希望我的结果范围是

1 # + 2 =
3 # + 4 =
7 # + 2 =
9 # + 4 =
13 # + 2 =
15 # + 4 =
19 # + 2 = 21 (out of range, STOP ITERATION)

但是,我想不出一个办法来做到这一点。这在 Ruby 中完全可行吗?

最佳答案

您可以使用 cycle 的组合和 Enumerator :

class Range
def multi_step(*steps)
a = min
Enumerator.new do |yielder|
steps.cycle do |step|
yielder << a
a += step
break if a > max
end
end
end
end

p (1..20).multi_step(2, 4).to_a
#=> [1, 3, 7, 9, 13, 15, 19]

注意第一个元素是1,因为(1..20).step(2)的第一个元素也是1。

需要exclude_end?考虑到:

p (1...19).multi_step(2, 4).to_a
#=> [1, 3, 7, 9, 13, 15]

可以偷懒:

p (0..2).multi_step(1,-1).first(20)
#=> [0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1]
p (0..Float::INFINITY).multi_step(*(1..100).to_a).lazy.map{|x| x*2}.first(20)
#=> [0, 2, 6, 12, 20, 30, 42, 56, 72, 90, 110, 132, 156, 182, 210, 240, 272, 306, 342, 380]

这是 FizzBuzz 的一个变体, 它生成所有 3 或 5 的倍数但不是 15 的倍数:

p (3..50).multi_step(2,1,3,1,2,6).to_a
#=> [3, 5, 6, 9, 10, 12, 18, 20, 21, 24, 25, 27, 33, 35, 36, 39, 40, 42, 48, 50]

关于ruby - 有没有办法在 Ruby 中指定一个多步骤?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41418904/

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