2010-08-25 12 views
6

Ich habe eine Methode in Ruby geschrieben alle Kreis Kombination aus einem dort diese einen besseren Weg zu implementieren, istWie findet man alle Zyklen eines Strings in Ruby?

x = "ABCDE" 
(x.length).times do 
    puts x 
    x = x[1..x.length] + x[0].chr 
end 

Text zu finden?

+0

"Besser" in welchem ​​Sinne? –

+0

meine ich bereits bestehende Methoden? – bragboy

Antwort

11

Hier ist ein alternativer Ansatz.

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

benutzen ich einen Bereich und #collect mit der Annahme, dass Sie mit den Saiten etwas anderes tun (sie nicht nur drucken) wollen werden.

+0

Perfekt !! Das ist genau das, was ich gesucht habe. – bragboy

+0

'(str * 2) [i, str.length]' nahm mich ein paar, um mich zu hören. Aber dann wurde mir klar, dass es ein Genie war. Schöne Lösung! –

4

Ich würde so etwas tun:

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

Es verkettet die Zeichenfolge aus dem aktuellen Index bis zum Ende, mit dem Beginn des aktuellen Index.

Auf diese Weise müssen Sie Ihre ursprüngliche Variable überhaupt nicht ändern.

+0

Danke Squeegy, mir hat deine Lösung auch gefallen! – wuputah

2

Kombinieren Sie die Zeichenfolge mit sich selbst und erhalten Sie alle aufeinanderfolgenden Elemente der Größe n (n ist Länge der ursprünglichen Zeichenfolge) mit Enumerable.each_cons.

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

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

leichte Variation: (s * 2) .split (''. Each_cons (s.size) .map (&: join) [0 ..- 2] Brauchen Sie nicht uniq nur die letzte Zeichenfolge ausschneiden im Array. –

+0

danke @ Vijay, das ist eine gute Optimierung – Anurag

3

Sie könnten einen Enumerator schreiben.

#!/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 

So können Sie solche Dinge tun.

"test".rotations.each {|r| puts r} 
Verwandte Themen