2010-04-28 44 views

回答

1

枚举只到N,

开发给出了一些N,F功能(N)为您提供了您可能的解决方案范围中的第n项。

对于您的情况,您可以将您的范围视为基数为26的数字系统。重新编号是一个众所周知的问题。即使在红宝石(由我的一个同事制作)中,也有一个example on my site从基数为10的数字变为基数为26的数字(用字母表表示)。这种算法的一些变化可能也适用于你。

更新 也许它没有下沉,这是你的答案: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" 
8

一个快速简便的方法:

("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" 

注:我假设你想要的任何可枚举的作品,而不是字母范围的解决方案(在这种情况下,你应该直接计算的话)。我也假设红宝石1.8.7+,否则升级或require "backports"

+0

我不知道'['list']。first(n)'...太棒了! – Pete 2010-06-23 17:24:16