Обратная строка в Ruby - PullRequest
37 голосов
/ 17 июня 2010

Как вы переворачиваете строку в Ruby? Я знаю о строке # обратный. Мне интересно понять, как написать это на чистом Ruby, предпочтительно на месте.

Ответы [ 21 ]

1 голос
/ 31 декабря 2010

Также, используя Procs ...

Proc.new {|reverse_me| reverse_me.chars.inject([]){|r,c| r.unshift c}.join}.call("The house is blue")

=> "eulb si esuoh ehT"

Proc.new был бы здесь полезен, потому что вы могли бы затем вложить свой алгоритм реверсирования (и при этом держать все в одной строке). Это было бы удобно, если, например, вам нужно повернуть каждое слово в уже перевернутом предложении:

# Define your reversing algorithm
reverser = Proc.new{|rev_me| rev_me.chars.inject([]){r,c| r.unshift c}.join}

# Run it twice - first on the entire sentence, then on each word
reverser.call("The house is blue").split.map {|w| reverser.call(w)}.join(' ')

=> "blue is house The"
1 голос
/ 19 марта 2014
def palindrome(string)

  s = string.gsub(/\W+/,'').downcase

  t = s.chars.inject([]){|a,b| a.unshift(b)}.join

  return true if(s == t)

  false

end
1 голос
/ 23 мая 2016

Это решение имело для меня, как для начинающего рубина, наибольшее значение

def reverse(string)
  reversed_string = ''

  i = 0
  while i < string.length
    reversed_string = string[i] + reversed_string
    i += 1
  end

  reversed_string
end

p reverse("helter skelter")
1 голос
/ 01 сентября 2015
def reverse(string)
  result = ""
  idx = string.length - 1
  while idx >= 0
  result << string [idx]
  idx = idx - 1
 end

 result

end 
0 голосов
/ 13 октября 2013

в рубине:

name = "Hello World"; reverse_proc.call(name) 

name = "Hello World"; name.reverse! 

name = "Hello World"; name.chars.inject([]){|s, c| s.unshift(c)}.join 

name = "Hello World"; name.reverse_inplace!; 

name = "Hello World"; reverse(name) 

name = "Hello World"; reverse_string(name) 
0 голосов
/ 26 мая 2011

Вот альтернативный вариант использования битовых операций xor:

class String

  def xor_reverse
    len = self.length - 1
    count = 0

    while (count < len)
      self[count] ^= self[len]
      self[len] ^= self[count]
      self[count] ^= self[len]

      count += 1
      len -= 1
    end

  self
end

"foobar".xor_reverse
=> raboof
0 голосов
/ 01 июля 2015

Вот простая альтернатива: сначала она разбивает строку на массив, считает длину и вычитает ее (из-за правила индексации ruby ​​для массива, начинающегося с 0), создает пустую переменную, затем запускает итерацию для ключей массив при добавлении значения длины массива минус текущий индекс массива к созданной пустой переменной, и когда он достигает нулевого значения (извините за мой французский), он останавливается. Надеюсь, это поможет.

class String
   def rString
       arr = self.split("")
       len = arr.count - 1
       final = ""
       arr.each_index do |i|
           final += arr[len - i]
       end
       final
  end
end
0 голосов
/ 30 июня 2015
string = "This is my string"
string_arr = string.split('')
n = string_arr.length
new_arr = Array.new

17.times do |i|
  new_arr << string_arr.values_at(n - i)
end

reversed_string = new_arr.flatten.join('')
=> "gnirts ym si sihT"
0 голосов
/ 13 февраля 2014

Я верю, что это будет работать также

def reverse(str)
  string = ''
   (0..str.size-1).each do |i|
    string << str[str.size - 1 - i]
   end
  string
end
0 голосов
/ 17 февраля 2015

Если у вас есть предложение «Величайшая победа - это то, что», и вы хотите иметь «это величайшая победа», «вам следует использовать этот метод

def solution(sentance)
  sentance.split.reverse.join(" ")
end

solution("The greatest victory is that")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...