Ruby从大范围内获取第n项

Ruby从大范围内获取第n项,ruby,range,enumerate,Ruby,Range,Enumerate,假设我有这个范围: ("aaaaa".."zzzzz") 如何从该范围中获取第n个项目,而不必事先/每次生成整个项目?一种快速简便的方法: ("aaaaa".."zzzzz").first(42).last # ==> "aaabp" 如果出于某种原因,必须反复执行此操作,或者如果需要避免为前N个元素构建中间数组,则可以编写如下代码: module Enumerable def skip(n) return to_enum :skip, n unless block_gi

假设我有这个范围:

("aaaaa".."zzzzz")
如何从该范围中获取第n个项目,而不必事先/每次生成整个项目?

一种快速简便的方法:

("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"
模块可枚举
def跳过(n)
返回到_枚举:跳过,n,除非给出块_?
每个带有索引do的项目,索引|
收益项目,除非指数“aaabp”

注意:我假设您想要一个适用于任何可枚举项的解决方案,而不是适用于字母范围(在这种情况下,您应该直接计算它)。我还假设Ruby 1.8.7+,否则升级或
需要“backport”

最多只能枚举n

开发一个函数,给定一个数字n,f(n)给出可能解决方案范围的第n项

在您的情况下,您可以将范围视为以26为基数的数字系统。重定数字的基址是一个众所周知的问题。即使在ruby(由我的一位同事制作)中,也有一个从10进制数字到26进制数字(由字母表表示)的转换。这种算法的一些变化可能也适用于您

更新 也许你没有意识到这是你的答案:D

以下是获取范围第n项的ruby代码:

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

你到底需要用这个做什么?您正在尝试生成随机字符串吗?我不知道有关
['list']的信息。首先(n)
。。。太棒了!
irb(main):030:0> rbase(789).rjust(10,'a')
=> "aaaaaaabej"