Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 创建包含在两个边界之间振荡的值的数组_Arrays_Ruby - Fatal编程技术网

Arrays 创建包含在两个边界之间振荡的值的数组

Arrays 创建包含在两个边界之间振荡的值的数组,arrays,ruby,Arrays,Ruby,我想知道是否有一种方法可以生成一个数组,例如从0开始,增加1直到达到3,然后减少1直到再次达到0,例如 [0,1,2,3,2,1,0] 如果我能提前指定数组中的值的数量,那就太好了。例如,如果我可以设置数组的下限(0)、上限(3)、增量(1)和长度(9): []振荡(0,3,1,9)将给出以下结果: [0,1,2,3,2,1,0,1,2] 到目前为止,我能想到的最好的办法是: values = [] until values.count >= 9 values.pop

我想知道是否有一种方法可以生成一个数组,例如从0开始,增加1直到达到3,然后减少1直到再次达到0,例如

[0,1,2,3,2,1,0]

如果我能提前指定数组中的值的数量,那就太好了。例如,如果我可以设置数组的下限(0)、上限(3)、增量(1)和长度(9):

[]振荡(0,3,1,9)将给出以下结果:

[0,1,2,3,2,1,0,1,2]

到目前为止,我能想到的最好的办法是:

values = []
  until values.count >= 9
    values.pop
    x=0
    values << x && x+=1 while x < 3
    values << x && x-=1 while x >= 0 

  end
值=[]
直到values.count>=9
流行音乐
x=0
值试试这个

def oscillate(a, b, step, num)
  ramp_up = a.step(b, step).entries
  ramp_down = ramp_up.drop(1).reverse.drop(1)
  ramp_up.concat(ramp_down).cycle.take(num)
end
这是怎么回事

  • 创建
    ramp\u up
    ramp\u down
    数组
  • 连接两个数组
  • cycle
    返回一个不断重复的枚举数
  • take
    具体化该枚举器中的
    num
    元素。除了评论中的建议外,这不会重新计算任何内容。它只是具体化来自枚举器的条目
有趣的运动

你在找一份工作。 维基百科上的公式适用于标准形状(介于-1和1之间),但这里有一个适用于任何波位置、周期和振幅的修改版本:

def triangle_wave(min, max, increment, length, offset = 0)
  amplitude = max - min
  period = 2 * amplitude
  Array.new(length) do |i|
    min + ((increment * (i + offset) - amplitude) % period - amplitude).abs
  end
end

puts triangle_wave(0, 3, 1, 9) == [0, 1, 2, 3, 2, 1, 0, 1, 2]
# true

p triangle_wave(-3, 3, 1, 20)
# => [-3, -2, -1, 0, 1, 2, 3, 2, 1, 0, -1, -2, -3, -2, -1, 0, 1, 2, 3, 2]

p triangle_wave(5, 9, 2, 9)
# => [5, 7, 9, 7, 5, 7, 9, 7, 5]

p triangle_wave(0, 1, 0.25, 9)
# => [0.0, 0.25, 0.5, 0.75, 1.0, 0.75, 0.5, 0.25, 0.0]

p triangle_wave(-3, 0, 1, 9, 3)
# => [0, -1, -2, -3, -2, -1, 0, -1, -2]

p triangle_wave(0, 1, 1, 9)
# => [0, 1, 0, 1, 0, 1, 0, 1, 0]

min
应低于
max
increment
应为正,
max-min
应可被
increment
整除。这些是对输入的限制,而不是对输出的限制:任何波形都可以生成。

这个问题可能是使用Ruby的一个教科书上的例子

由于该问题仅在存在非负整数
步骤时才有意义,因此
高=低+步骤*增量
,因此我将该方法的参数
替换为
步骤

def oscillate(low, steps, increment, length)
  high = low + steps * increment 
  n = low
  length.times.each_with_object([]) do |_,a|
    a << n
    n += (n==low)..(n==high-increment) ? increment : -increment
  end
end

oscillate(0,3,1,9)
  #=> [0, 1, 2, 3, 2, 1, 0, 1, 2]

oscillate(-1, 4, 2, 16)    
  #=> [-1, 1, 3, 5, 7, 5, 3, 1, -1, 1, 3, 5, 7, 5, 3, 1]

这很好,但它会重新计算每次拍摄的整个序列。小序列可以,但如果序列较大,我建议添加备忘录。谢谢你的方法@马特夫很高兴听到这是有益的!如果你喜欢这个答案,可以考虑用复选标记来接受它。你会在哪里添加回忆录?@akuhn抱歉我误读了这个问题。本计划只调用一次。很抱歉给你带来了困惑。我要重申,这是一个很好的解决方案!非常感谢你的帮助!美好的这是我第一次看到触发器的合法使用。
def oscillate(low, steps, increment, length)
  high = low + steps * increment
  puts "high = #{high}" 
  n = low
  length.times.each_with_object([]) do |_,a|
    a << n
    diff = (n==low)..(n==high-increment) ? increment : -increment
    print "n=#{n}, a<<n=#{a}, diff=#{diff}, " 
    n += diff
    puts "n+=diff=#{n}" 
  end
end

oscillate(0,3,1,9)
high = 3
n=0, a<<n=[0],                         diff= 1, n+=diff=1
n=1, a<<n=[0, 1],                      diff= 1, n+=diff=2
n=2, a<<n=[0, 1, 2],                   diff= 1, n+=diff=3
n=3, a<<n=[0, 1, 2, 3],                diff=-1, n+=diff=2
n=2, a<<n=[0, 1, 2, 3, 2],             diff=-1, n+=diff=1
n=1, a<<n=[0, 1, 2, 3, 2, 1],          diff=-1, n+=diff=0
n=0, a<<n=[0, 1, 2, 3, 2, 1, 0],       diff= 1, n+=diff=1
n=1, a<<n=[0, 1, 2, 3, 2, 1, 0, 1],    diff= 1, n+=diff=2
n=2, a<<n=[0, 1, 2, 3, 2, 1, 0, 1, 2], diff= 1, n+=diff=3
  #=> [0, 1, 2, 3, 2, 1, 0, 1, 2]