Załóżmy, że mam działyRuby uzyskać n-ty element z ogromnej gamy
("aaaaa".."zzzzz")
Jak uzyskać n-ty element z zakresu bez generowania całą rzecz przed strony/za każdym razem?
Załóżmy, że mam działyRuby uzyskać n-ty element z ogromnej gamy
("aaaaa".."zzzzz")
Jak uzyskać n-ty element z zakresu bez generowania całą rzecz przed strony/za każdym razem?
wyliczyć tylko do n,
lub
Develop funkcję daną liczbę n, F (n) daje n-ty z zakresu możliwych rozwiązań.
W twoim przypadku możesz traktować swój zasięg jako system liczbowy z podstawą 26. Przepisanie numeru jest dobrze znanym problemem. Jest example on my site, aby przejść od numeru base-10 do liczby bazowej-26 (reprezentowanej przez alfabet) nawet w rubinach (zrobionych przez mojego kolegę). Niektóre warianty tego algorytmu prawdopodobnie również będą działać dla ciebie.
Aktualizacja Może to nie zapadają się tym, że jest to odpowiedź: D
Oto kod Ruby, aby uzyskać n-ty element swojego zakresu:
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
Następnie można użyć to tak.
irb(main):030:0> rbase(789).rjust(10,'a')
=> "aaaaaaabej"
Szybki i łatwy sposób:
("aaaaa".."zzzzz").first(42).last # ==> "aaabp"
Jeśli z jakiegoś powodu trzeba to zrobić w kółko, albo jeśli chcesz uniknąć budowania pośredni tablicę dla pierwszych elementów n, można napisać coś jak:
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"
Uwaga: Zakładam, że chcesz rozwiązanie, które działa na każdym przeliczalny, a nie dla zakresu liter (w tym przypadku należy obliczyć bezpośrednio). Ja też zakładając Ruby 1.8.7+, inaczej uaktualnić lub require "backports"
Nie wiedziałem o '['liście']. First (n)' ... to jest niesamowite! – Pete
Czego dokładnie użyć do tego celu? Czy próbujesz wygenerować losowy ciąg? –