Ruby从大量范围中获得第n个项目
Posted
技术标签:
【中文标题】Ruby从大量范围中获得第n个项目【英文标题】:Ruby get nth item from massive range 【发布时间】:2011-02-13 12:30:19 【问题描述】:假设我有这个范围:
("aaaaa".."zzzzz")
如何在不事先/每次都生成整个内容的情况下从范围中获取第 N 个项目?
【问题讨论】:
你到底需要用这个做什么?您是否尝试生成随机字符串? 【参考方案1】:快速简便的方法:
("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"
注意:我假设您想要一个适用于任何 Enumerable 的解决方案,而不是适用于字母范围的解决方案(在这种情况下,您应该直接计算它)。我也假设 Ruby 1.8.7+,否则升级或require "backports"
【讨论】:
我不知道['list'].first(n)
...太棒了!【参考方案2】:
只枚举到 n,
或
开发一个给定数字 n 的函数,f(n) 为您提供可能解决方案范围中的第 n 项。
在您的情况下,您可以将您的范围视为以 26 为底的数字系统。重新调整数字是一个众所周知的问题。即使在红宝石(由我的同事制作)中,也有一个example on my site 可以从以 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
那么你可以这样使用它。
irb(main):030:0> rbase(789).rjust(10,'a')
=> "aaaaaaabej"
【讨论】:
以上是关于Ruby从大量范围中获得第n个项目的主要内容,如果未能解决你的问题,请参考以下文章