最小值和最大价格之间的范围数组的数字与差异

时间:2018-02-06 05:58:50

标签: arrays ruby range

我有一个数组prices

[1399, 1435, 1465, 1715, 1745, 1760, 1825]

我想要一个介于最小和最大价格之间的范围数组,差异为100。我需要这样的东西:

[1399..1499, 1499..1599, 1599..1699, 1699..1799, 1799..1899]

有单行吗?

2 个答案:

答案 0 :(得分:4)

n = 100
arr = [1399, 1435, 1465, 1715, 1745, 1760, 1825]

start = arr.first
arr.slice_before do |x|
  if x > start + n
    start = x
    true
  else
    false
  end
end.map { |f,*_| f..f+n }
  #=> [1399..1499, 1715..1815, 1825..1925]

返回数组中的第三个范围与两个方面所需的范围不同。第三个范围被要求为1815..1825。我认为1815是一个拼写错误,好像与第二个范围的逻辑不同。如果希望最后一个范围的结尾应该是arr的最后一个元素,而不是该范围的第一个元素加n,那么修复它只是有点混乱。它可以如下完成。

a = [1399..1499, 1715..1815, 1825..1925]

如上所述。然后

a[0..-2] << (a.last.begin..arr.last)
  #=> [1399..1499, 1715..1815, 1825..1825]

答案 1 :(得分:1)

n(在这种情况下,100)可以step

array = [1399, 1435, 1465, 1715, 1745, 1760, 1825]
array.min.step(to: array.max + n, by: n).each_cons(2).map { |a, b| a..b }
# => [1399..1499, 1499..1599, 1599..1699, 1699..1799, 1799..1899]
array << 1899
array.min.step(to: array.max + n, by: n).each_cons(2).map { |a, b| a..b }
# => [1399..1499, 1499..1599, 1599..1699, 1699..1799, 1799..1899, 1899..1999]

请注意,step未向块传递任何大于to:的值,因此,如果您将最大值增加n,事情似乎就会解决。