2010-08-25 16 views

cevap

11

İşte alternatif bir yaklaşım.

str = "ABCDE" 
(0...str.length).collect { |i| (str * 2)[i, str.length] } 

Sana dizeleri (sadece onları baskı değil) ile başka bir şey yapmak isteyeceksiniz varsayımıyla bir dizi ve #collect kullandı.

+0

Mükemmel! Bu tam olarak ben arıyordum wat .. – bragboy

+0

(str * 2) [i, str.length] 'Benim duydum almak için bana bir kaç aldı. Ama sonra farkettim ki dahiydi. Güzel çözüm! –

4

Böyle bir şey yapacağını:

x = "ABCDE" 
x.length.downto(0) do |i| 
    puts x[i..-1] + x[0...i] 
end 

Mevcut endekse başlaması ile birlikte, sonuna kadar geçerli dizinden dize birleştirir.

Bu şekilde, orijinal değişkeninizi hiç değiştirmenize gerek yoktur.

+0

Teşekkürler Squeegy, ben de çözümünü beğendim! – wuputah

2

Dizeyi kendi başına birleştirin ve Enumerable.each_cons kullanarak n (n uzunluğunun orijinal dizgenin uzunluğu) olan birbirini takip eden tüm öğeleri alın.

s = "hello" 
(s + s).split('').each_cons(s.size).map(&:join)[0..-2] 

# ["hello", "elloh", "llohe", "lohel", "ohell"] 
+0

küçük bir varyasyon: (s * 2) .split (''). Each_cons (s.size) .map (&: birleştirme) [0 ..- 2] Sadece son dizgiyi kesmek için uniq gerekmez dizide. –

+0

teşekkürler @Vijay, bu iyi bir optimizasyon – Anurag

3

Bir numaralayıcı yazabilirsiniz.

#!/usr/bin/env ruby 

class String 
    def rotations 
    Enumerator.new do|y| 
     times = 0 
     chars = split('') 

     begin 
     y.yield chars.join('') 

     chars.push chars.shift 
     times += 1 
     end while times < chars.length 
    end 
    end 
end 

Böylelikle böyle şeyler yapabilirsiniz.

"test".rotations.each {|r| puts r} 
İlgili konular