2010-08-25 19 views
6

Ho scritto un metodo in Ruby per trovare tutte le combinazioni circolare di un testoCome trovare tutti i cicli di una stringa in Ruby?

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

C'è un modo migliore per implementare questo?

+0

"Meglio" in che senso? –

+0

intendo metodi già esistenti? – bragboy

risposta

11

Ecco un approccio alternativo.

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

Ho usato una gamma e #collect con il presupposto che si vorrà fare qualcosa di diverso con le corde (non solo stamparli).

+0

Perfetto !! Questo è esattamente il wat che stavo cercando .. – bragboy

+0

'(str * 2) [i, str.length]' mi ha portato alcuni a farmi ascoltare. Ma poi ho capito che era geniale. Bella soluzione! –

4

vorrei fare qualcosa di simile:

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

E concatena la stringa dall'indice attuale fino alla fine, con l'inizio per l'indice corrente.

In questo modo non è necessario modificare la variabile originale.

+0

Grazie Squeegy, anche la tua soluzione mi è piaciuta! – wuputah

2

Combinare la stringa a se stessa e ottenere tutti gli elementi consecutivi di dimensione n (n è la lunghezza della stringa originale) utilizzando Enumerable.each_cons.

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

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

leggera variazione: (s * 2) .split (''). Each_cons (s.size) .map (&: join) [0 ..- 2] Non è necessario fare uniq solo per ritagliare l'ultima stringa nell'array. –

+0

grazie @Vijay, è una buona ottimizzazione – Anurag

3

È possibile scrivere un enumeratore.

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

In questo modo puoi fare cose come questa.

"test".rotations.each {|r| puts r} 
Problemi correlati