Ruby从大范围获得第n项

Bub*_*lee 6 ruby enumerate range

假设我有这个范围:

("aaaaa".."zzzzz")
Run Code Online (Sandbox Code Playgroud)

如何在不事先产生整个事物的情况下从范围中获取第N个项目/每次?

Mar*_*une 9

一种快速简便的方法:

("aaaaa".."zzzzz").first(42).last  # ==> "aaabp"
Run Code Online (Sandbox Code Playgroud)

如果由于某种原因你必须反复这样做,或者如果你需要避免为前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"
Run Code Online (Sandbox Code Playgroud)

注意:我假设你想要一个适用于任何Enumerable的解决方案,而不是字母范围(在这种情况下你应该直接计算).我也假设Ruby 1.8.7+,否则升级或require "backports"


flq*_*flq 1

只枚举最多n个,

或者

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

在您的情况下,您可以将范围视为以 26 为基数的数字系统。重新确定数字的基数是一个众所周知的问题。我的网站上有一个示例,可以从 10 进制数字转换为 26 进制数字(由字母表表示),甚至在 ruby​​ 中也是如此(由我的一位同事制作)。该算法的某些变体可能也适合您。

更新 也许你没有意识到这是你的答案: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
Run Code Online (Sandbox Code Playgroud)

那么你就可以这样使用它。

irb(main):030:0> rbase(789).rjust(10,'a')
=> "aaaaaaabej"
Run Code Online (Sandbox Code Playgroud)