Реверсирование символов в строке независимо от количества пробелов - Ruby - PullRequest
0 голосов
/ 30 сентября 2018

Этот вопрос из codewars

Завершите функцию, которая принимает строковый параметр и переворачивает каждое слово в строке.Все пробелы в строке должны быть сохранены.

Вот мой код, который работает только для строки с одиночными пробелами, но я не могу понять, как что-то добавить / вычесть, чтобы она работаладля строки с более чем одним пробелом между каждым словом.

def reverse_words(str)

str.split(" ").map(&:reverse!).join(" ")

end

Примеры приведены:

('The quick brown fox jumps over the lazy dog.'), 'ehT kciuq nworb xof spmuj revo eht yzal .god')

('apple'), 'elppa')

('a b c d'), 'a b c d')

('double  spaced  words'), 'elbuod  decaps  sdrow')

Ответы [ 4 ]

0 голосов
/ 01 октября 2018

Ну,

 f = " Hello im the     world"
 ff = f.split #=> ["Hello", "im", "the", "world"]
 ff.each do |a|
       a.reverse! #=> ["olleH", "mi", "eht", "dlrow"]
 end

ff.join! #=> "olleH mi eht dlrow" 
0 голосов
/ 30 сентября 2018

Я думаю, что самый простой способ справиться с этим - использовать регулярное выражение.

def reverse_words(str)
  str
    .scan(/(\s*)(\S+)(\s*)/)
    .map { |spacer1, word, spacer2| spacer1 + word.reverse + spacer2 }
    .join
end

Это ищет в строке ноль или более пробелов, захваченных первой группой.Далее следуют одно или несколько непробельных символов, захваченных второй группой.Далее следуют ноль или более пробелов, захваченных в третьей группе.Сопоставляя полученный массив, мы можем объединить спейсеры с обратным словом и объединить все вместе.

Вышеуказанный результат приводит к следующему выводу:

  • reverse_words('The quick brown fox jumps over the lazy dog.')
    #=> "ehT kciuq nworb xof spmuj revo eht yzal .god"
    
  • reverse_words('apple')
    #=> "elppa"
    
  • reverse_words('a b c d')
    #=> "a b c d"
    
  • reverse_words('double  spaced  words')
    #=> "elbuod  decaps  sdrow"
    
  • reverse_words(' foo    bar   ')
    #=> " oof    rab   "
    

Ссылки:

0 голосов
/ 30 сентября 2018

Просто играть с рекурсией, даже если ответ Йохана Вентолта пока лучший:

def part(string)
  if string.count(" ") > 0
    ary = string.partition(/\s{1,}/)
    last = ary.pop
    ary << part(last)
    ary.flatten
  else string
  end
end

part(string).map(&:reverse).join
0 голосов
/ 30 сентября 2018

Вот, пожалуйста:

irb(main):023:0> 'double  spaced  words'.split(//).reverse.join
=> "sdrow  decaps  elbuod"

Передайте регулярное выражение, чтобы String#split не пропускало пробелы.Есть похожие примеры в документах

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...