2010-04-28 43 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