Yakut

2010-04-28 19 views
5

varsayalım bu aralığı vardır masif mesafeden n'inci öğeyi almak:Yakut

Ben el/her zaman önce tüm şey oluşturmadan aralığından N. öğeyi alacağı Nasıl
("aaaaa".."zzzzz") 

?

+0

Tam olarak bunun için ne kullanmanız gerekiyor? Rastgele bir dizi oluşturmaya mı çalışıyorsunuz? –

cevap

1

sadece n kadar Numaralandırma,

veya

yükseltme veya Ruby 1.8.7+ tahmin ediyorum (n) verir olası çözümler yelpazenizin nth öğesi. Sizin durumunuzda, aralığınızı, baz sayısı 26 olan bir sayı sistemi olarak değerlendirebilirsiniz. Bir sayıyı geri almak, iyi bilinen bir sorundur. Yakut (hatta bir meslektaşım tarafından yapılan) bir üste-10'dan taban-26'ya kadar bir sayıya (alfabeyle temsil edilen) gitmek için example on my site var. Bu algoritmanın bazı çeşitleri muhtemelen sizin için de çalışır.

Güncelleme Belki bu Cevabınız ki batmadı: D

İşte aralığının inci madde almak için yakut kod:

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 

o zaman kullanabilirsiniz bunun gibi.

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

hızlı ve kolay yolu: nedense tekrar tekrar bunu yapmak zorunda, öncelikle N elemanları ara dizi bina kaçınmak gerekiyorsa

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

veya, bir şey yazabilirsiniz gibi:

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" 

Not: Ben değil harflerin aralığı için, herhangi Enumerable için çalışan bir çözüm istiyor farz ediyorum (bu durumda doğrudan hesaplamak gerekir). Ben de başka türlü bir sayı n, f verilen bir fonksiyon geliştirin require "backports"

+0

Ben ['list'] 'i bilmedim ilk (n) '... bu harika! – Pete