Я написал метод в Ruby, чтобы найти все циклические комбинации текста
x = "ABCDE" (x.length).times do puts x x = x[1..x.length] + x[0].chr end
Есть ли лучший способ реализовать это?
Вот альтернативный подход.
str = "ABCDE" (0...str.length).collect { |i| (str * 2)[i, str.length] }
Я использовал диапазон и #collect с предположением, что вы захотите сделать что-то еще со строками (а не просто напечатать их).
#collect
Я бы сделал что-то вроде этого:
x = "ABCDE" x.length.downto(0) do |i| puts x[i..-1] + x[0...i] end
Он объединяет строку от текущего индекса до конца, начиная с текущего индекса.
Таким образом, вы не 'Вам вообще не нужно изменять исходную переменную.
Вы могли бы написать перечислитель.
#!/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}
Объедините строку в себя и получите все последовательные элементы размера n (n - длина исходной строки), используя Enumerable.each_cons.
Enumerable.each_cons
s = "hello" (s + s).split('').each_cons(s.size).map(&:join)[0..-2] # ["hello", "elloh", "llohe", "lohel", "ohell"]