Szukałem eleganckiego i wydajnego sposobu na podzielenie sznurka na podciągi o określonej długości w Rubim.
Jak dotąd najlepsze, co mogłem wymyślić, to:
def chunk(string, size)
(0..(string.length-1)/size).map{|i|string[i*size,size]}
end
>> chunk("abcdef",3)
=> ["abc", "def"]
>> chunk("abcde",3)
=> ["abc", "de"]
>> chunk("abc",3)
=> ["abc"]
>> chunk("ab",3)
=> ["ab"]
>> chunk("",3)
=> []
Może chcesz chunk("", n)
, aby powrócić [""]
zamiast []
. Jeśli tak, po prostu dodaj to jako pierwszy wiersz metody:
return [""] if string.empty?
Czy poleciłbyś jakieś lepsze rozwiązanie?
Edytować
Podziękowania dla Jeremy'ego Rutena za to eleganckie i wydajne rozwiązanie: [edytuj: NIE wydajne!]
def chunk(string, size)
string.scan(/.{1,#{size}}/)
end
Edytować
Rozwiązanie string.scan zajmuje około 60 sekund, aby posiekać 512k na 1k kawałków 10000 razy, w porównaniu z oryginalnym rozwiązaniem opartym na plasterkach, które zajmuje tylko 2,4 sekundy.