2010-08-25 5 views
6

J'ai écrit une méthode en Ruby pour trouver toute la combinaison circulaire d'un texteComment trouver tous les cycles d'une chaîne dans Ruby?

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

Y at-il une meilleure façon de mettre en œuvre ce?

+0

"Mieux" dans quel sens? –

+0

je veux dire des méthodes déjà existantes? – bragboy

Répondre

11

Voici une autre approche.

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

J'ai utilisé une gamme et #collect avec l'hypothèse que vous voulez faire quelque chose d'autre avec les cordes (et pas seulement les imprimer).

+0

Parfait !! C'est exactement wat que je cherchais .. – bragboy

+0

'(str * 2) [i, str.length]' m'a pris quelques-uns pour obtenir mon entendu autour. Mais ensuite j'ai réalisé que c'était un génie. Belle solution! –

4

je ferais quelque chose comme ceci:

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

concatène la chaîne de l'index en cours à la fin, avec le début à l'indice actuel. De cette façon, vous n'avez pas du tout besoin de modifier votre variable d'origine.

+0

Merci Squeegy, j'ai aussi aimé ta solution! – wuputah

2

Combiner la chaîne à elle-même et obtenir tous les éléments consécutifs de taille n (n est la longueur de la chaîne d'origine) en utilisant Enumerable.each_cons.

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

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

Légère variation: (s * 2) .split (''). Each_cons (s.size) .map (&: join) [0 ..- 2] Ne pas faire uniq juste pour couper la dernière chaîne dans le tableau. –

+0

merci @Vijay, c'est une bonne optimisation – Anurag

3

Vous pouvez écrire un énumérateur.

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

De cette façon, vous pouvez faire des choses comme ça.

"test".rotations.each {|r| puts r} 
Questions connexes