整数到块数组

Yas*_*ine 2 ruby range

我需要将一个整数转换为一个间隔数组.例如,

number_to_steps(number: 10, step: 3)
# => [[0, 2], [3, 5], [6, 8], [9, 9]]

number_to_steps(number: 7, step: 2)
# => [[0, 1], [2, 3], [4, 5], [6, 6]]

number_to_steps(number: 8, step: 2)
# => [[0, 1], [2, 3], [4, 5], [6, 7]]
Run Code Online (Sandbox Code Playgroud)

我试过了:

def number_to_ranges(number:, size:)
    chunks = ((number - 1) / size.to_f).ceil

    (0..chunks - 1).map do |index|
      from = index * size
      to = (index + 1) * size - 1

      [ from, to > number ? number : to ]
    end
  end
Run Code Online (Sandbox Code Playgroud)

但它不能正常工作.例如,

number_to_ranges(number: 14, step: 4)
[[0, 3], [4, 7], [8, 11], [12, 14]]
Run Code Online (Sandbox Code Playgroud)

不应该去14.

任何的想法?

Sag*_*dya 7

将使用另一种方法(对您的方法)each_slice.

def number_to_steps(number:, step:)
  (0...number).each_slice(step).map { |arr| [arr.first, arr.last] }
end
Run Code Online (Sandbox Code Playgroud)

测试:

number_to_steps(number: 10, step: 3)
 #=> [[0, 2], [3, 5], [6, 8], [9, 9]]

number_to_steps(number: 7, step: 2)
 #=> [[0, 1], [2, 3], [4, 5], [6, 6]]

number_to_steps(number: 8, step: 2)
 #=> [[0, 1], [2, 3], [4, 5], [6, 7]]
Run Code Online (Sandbox Code Playgroud)

  • `(0 ...数字).each_slice(步).map(&:minmax)`:) (2认同)

Car*_*and 7

def number_to_steps(number:, size:)
  (0..number-1).step(size).map { |i| [i, [i+size, number].min-1] }
end

number_to_steps(number: 10, size: 3)
  #=> [[0, 2], [3, 5], [6, 8], [9, 9]]

number_to_steps(number: 7, size: 2)
  #=> [[0, 1], [2, 3], [4, 5], [6, 6]]

number_to_steps(number: 8, size: 2)
  #=> [[0, 1], [2, 3], [4, 5], [6, 7]]
Run Code Online (Sandbox Code Playgroud)