Ruby Получить n-й пункт из массивного диапазона
Вопрос
Предположим, у меня есть этот диапазон:
("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"