Как найти все циклы строки в Ruby? - PullRequest
6 голосов
/ 25 августа 2010

Я написал метод в Ruby, чтобы найти все циклические комбинации текста

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

Есть ли лучший способ реализовать это?

Ответы [ 4 ]

11 голосов
/ 25 августа 2010

Вот альтернативный подход.

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

Я использовал диапазон и #collect с предположением, что вы захотите сделать что-то еще со строками (а не просто напечатать их).

4 голосов
/ 25 августа 2010

Я бы сделал что-то вроде этого:

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

Он объединяет строку от текущего индекса до конца, начиная с текущего индекса.

Таким образом, вы не 'Вам вообще не нужно изменять исходную переменную.

3 голосов
/ 26 августа 2010

Вы могли бы написать перечислитель.

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

Таким образом, вы можете делать такие вещи.

"test".rotations.each {|r| puts r}
2 голосов
/ 25 августа 2010

Объедините строку в себя и получите все последовательные элементы размера n (n - длина исходной строки), используя Enumerable.each_cons.

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

# ["hello", "elloh", "llohe", "lohel", "ohell"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...