2010-04-28 20 views
5

Supongamos que tengo este rango:Rubí obtener enésimo elemento de enorme gama

("aaaaa".."zzzzz") 

¿Cómo puedo obtener el número de ítems de la gama sin generar toda la cosa antes de la mano/cada vez?

+0

¿Para qué exactamente necesita usar esto? ¿Estás tratando de generar una cadena aleatoria? –

Respuesta

1

Enumerar sólo hasta n,

o

Desarrollar una función que dado un número n, f (n) que da la enésimo artículo de su gama de posibles soluciones.

En su caso, puede tratar su rango como un sistema numérico con base 26. Volver a marcar un número es un problema bien conocido. Hay un example on my site para pasar de un número de base 10 a un número de base 26 (representado por el alfabeto) incluso en rubí (hecho por un colega mío). Algunas variaciones de este algoritmo probablemente también funcionarían para usted.

actualización Tal vez no se hundió en que esta es la respuesta: D

Aquí está el código de rubí para obtener el número de ítems de su rango:

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 

continuación, puede utilizar es así.

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

Una forma rápida y fácil:

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

Si por alguna razón usted tiene que hacer esto una y otra vez, o si es necesario para evitar la construcción de la matriz intermedia durante los primeros N elementos, se podría escribir algo como:

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" 

Nota: estoy asumiendo que usted quiere una solución que funciona para cualquier Enumerable, no por rango de letras (en cuyo caso se debe calcular directamente). También estoy asumiendo Rubí 1.8.7+, de lo contrario actualizar o require "backports"

+0

No sabía acerca de '['list']. First (n)' ... ¡eso es asombroso! – Pete

Cuestiones relacionadas