Ruby Получить n-й пункт из массивного диапазона

StackOverflow https://stackoverflow.com/questions/2732512

  •  02-10-2019
  •  | 
  •  

Вопрос

Предположим, у меня есть этот диапазон:

("aaaaa".."zzzzz")

Как бы я получил нитый пункт из диапазона, не генерируя всю вещь до руки / каждый раз?

Это было полезно?

Решение

Перечислять только до н,

или

Разработайте функцию, заданную номер n, f (n), дает вам n-й пункт вашего диапазона возможных решений.

В вашем случае вы можете лечить свой диапазон в качестве номера системы с базой 26. Передача ряд - это хорошо известная проблема. Там есть Пример на моем сайте Перейти от базы-10 номера на базу - 26 числа (представленные алфавитом) даже в Ruby (сделанный моим коллегой). Некоторые вариации этого алгоритма, вероятно, также будут работать для вас.

ОбновлятьМожет быть, это не погрузилось в то, что это ваш ответ: D

Вот код Ruby, чтобы получить N-й пункт вашего диапазона:

def rbase(value)
  a = ('a'..'z')
  b = a.to_a
  base = b.length
  text = []
  begin 
    value, rest = value.divmod(base)
    text << b[rest]
  end until value.zero?
  text.reverse.join
end

Тогда вы можете использовать это так.

irb(main):030:0> rbase(789).rjust(10,'a')
=> "aaaaaaabej"

Другие советы

Быстрый и простой способ:

("aaaaa".."zzzzz").first(42).last  # ==> "aaabp"

Если по какой-то причине вы должны сделать это снова и снова, или если вам нужно избегать построения промежуточного массива для первых N элементов, вы можете написать что-то вроде:

module Enumerable
  def skip(n)
    return to_enum :skip, n unless block_given?
    each_with_index do |item, index|
      yield item unless index < n
    end
    self
  end
end

("aaaaa".."zzzzz").skip(41).first # ==> "aaabp"

Примечание. Я предполагаю, что вы хотите, чтобы решение, которое работает для любого перечисленного, не для диапазона букв (в этом случае вы должны рассчитать его напрямую). Я также предполагаю, что Ruby 1.8.7+, в противном случае обновление или require "backports"

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top