Дублирование в строковой капитализации. Рубин - PullRequest
0 голосов
/ 03 ноября 2018

Я новичок в Ruby, и мне нужна ваша помощь:

Задача состоит в том, чтобы написать функцию, которая будет возвращать следующий результат:

   "Hello", "hEllo", "heLlo", "helLo", "hellO"

Также нужно поработать над «двумя словами»

Проблема, с которой я столкнулся, связана с буквой «L», так как функция, кажется, использует их оба в строке.

Вот мой код:

def wave(str)
  str.each do |word|
    count = -1

    word.length.times do
      count += 1
      puts word.gsub(word[count],word[count].capitalize)
    end
  end
end

wave("hello")

Ответы [ 3 ]

0 голосов
/ 03 ноября 2018
def rep_it(word)
  Array.new(word.size) {|i| word [0,i] << word[i].upcase << word[i+1..-1].to_s}
end

rep_it 'hello'
  #=> ["Hello", "hEllo", "heLlo", "helLo", "hellO"]

Array :: new здесь хорошо работает, потому что в метод встроен необходимый индекс символов.

Когда i == word.size-1, << word[word.size] (<< nil) вызовет исключение; следовательно (уловка) << nil.to_s (<< ''). (См. NilClass # to_s .) Более длинным, но, возможно, более ясным, было бы написать блок следующим образом:

{|i| word [0,i] << word[i].upcase << ((i < word.size-1) ? word[i+1..-1] : '')}
0 голосов
/ 05 ноября 2018

Вот решение, которое я придумал

s = "hello there"
s.each_char.with_index.with_object([]) do |(l,i),arr|
  arr << "#{s}" and arr.last[i] = l if l.upcase! 
end
#=> ["Hello there", 
#     "hEllo there", 
#     "heLlo there", 
#     "helLo there", 
#     "hellO there", 
#     "hello There", 
#     "hello tHere", 
#     "hello thEre", 
#     "hello theRe", 
#    "hello therE"]

Если символ может быть в верхнем регистре (например, /[a-z]/) if l.upcase!, тогда вставьте копию str в Array (arr << "#{s}"), а затем замените символ в str[i] на версию с текущим повышением (arr.last[i] = l)

0 голосов
/ 03 ноября 2018

Это должно работать:

str = 'hi fi'
p str.size.times.map{ str.dup }.map.with_index{ |s, i| s[i] = s[i].upcase; s unless s[i] == ' '}.compact
#=> ["Hi fi", "hI fi", "hi Fi", "hi fI"]

Вот как это работает:

Сначала строится массив, содержащий n раз слова, где n - длина слова:

str.size.times.map{ str.dup } #=> ["hello", "hello", "hello", "hello", "hello"]

Обратите внимание, что .dup требуется для того, чтобы иметь возможность изменять каждый элемент массива, не затрагивая все элементы.

Затем сопоставьте с индексом ( Enummerator # with_index ), чтобы выделить букву в индексе. Наконец, возвращает s, если текущий символ не является пробелом, в этом случае он возвращает nil, поэтому вызывается .compact.

Это модифицированный метод OP, нет необходимости передавать массив строк в качестве аргумента:

def wave(str)
  str.length.times do |n|
    str_dup = str.dup
    str_dup[n] = str_dup[n].capitalize
    puts str_dup unless str_dup[n] == ' '
  end
end

wave('hi fi')
#=> Hi fi
#=> hI fi
#=> hi Fi
#=> hi fI
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...