2010-04-28 5 views
5

Angenommen, ich habe diesen Bereich:Rubin erhält n-ten Element aus dem massiven Bereich

("aaaaa".."zzzzz") 

Wie würde ich das N-te Element aus dem Bereich erhalten, ohne die ganze Sache vor der Hand/jedes Mal zu erzeugen?

+0

Wozu genau benötigen Sie dies? Versuchen Sie, eine zufällige Zeichenfolge zu generieren? –

Antwort

1

Aufzählen nur n up,

oder

eine Funktion entwickeln, die eine Nummer n, f (n) gibt Ihnen die Punkt Ihrer Auswahl möglicher Lösungen.

In Ihrem Fall können Sie Ihre Reichweite als ein Zahlensystem mit Basis 26 behandeln. Das Rebasting einer Nummer ist ein bekanntes Problem. Es gibt eine example on my site, um von einer Base-10-Nummer zu einer Base-26-Nummer (dargestellt durch das Alphabet) selbst in Ruby (von einem meiner Kollegen) zu gehen. Eine Variation dieses Algorithmus würde wahrscheinlich auch für Sie funktionieren.

aktualisieren Vielleicht hat es nicht sinken, dass dies Ihre Antwort: D

Hier ist der Ruby-Code der n-ten Element des Bereichs zu erhalten:

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 

dann können Sie verwenden Es ist so.

irb(main):030:0> rbase(789).rjust(10,'a') 
=> "aaaaaaabej" 
8

Eine schnelle und einfache Art und Weise:

("aaaaa".."zzzzz").first(42).last # ==> "aaabp" 

Wenn aus irgendeinem Grund Sie diese über zu tun haben, und über, oder wenn Sie den Aufbau der Zwischenmatrix für die ersten N Elemente zu vermeiden, müssen Sie etwas schreiben könnte wie:

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" 

Anmerkung: ich nehme an, Sie eine Lösung wollen, die für jede Enumerable, nicht für Buchstabenbereich arbeitet (in diesem Fall sollten Sie es direkt berechnen). Ich bin auch davon Ruby-1.8.7+, sonst aktualisieren oder require "backports"

+0

Ich wusste nicht über '['list']. Zuerst (n)' ... das ist super! – Pete