Замена старого индекса с измененным индексом в строке, а затем отправка его в массив - PullRequest
0 голосов
/ 02 апреля 2020

У меня есть вопрос новичка. Я пытаюсь просто заменить измененный индекс обратно в исходную строку, чтобы создать массив строк. Они последовательно преобразуют следующий индекс в следующем элементе. Вот что у меня есть. Может кто-нибудь помочь мне увидеть, что мне не хватает?

def wave(str)
  result = []
  index = 0
  while index < str.length
    i = str[index]
    if i == " "
      index =+ 1
    else
      upper = i.upcase
      val = str.rindex(upper) -1
      result.push("#{str[0...val]}#{str[val..-1]}")
      index += 1
    end
  end
  result
end

Я пытаюсь получить: ["Hello", "hEllo", "heLlo", "helLo", "hellO"] от - -> волна (привет)

Спасибо.

Ответы [ 3 ]

0 голосов
/ 02 апреля 2020

Проблема в том, что вы объявляете переменную upper, но не используете ее. Попробуйте переписать ваш код и используйте его. Если вы не уверены, что происходит в каждой строке кода, просто поставьте print перед ним.

0 голосов
/ 02 апреля 2020

Другой вариант - использовать Enumerable # map с Object # tap следующим образом:

str = 'hello'

str.size.times.map { |n| str.dup.tap { |s_dup| s_dup[n] = str[n].upcase } }

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

Необходимо дублировать исходную строку, чтобы избежать изменения исходная строка, которая будет возвращать ["HELLO", "HELLO", "HELLO", "HELLO", "HELLO"]

Для пропущенных пробелов:

str.size.times.flat_map { |n| str.dup.tap { |s_dup| s_dup[n] = str[n].upcase } unless str[n] == ' ' }
0 голосов
/ 02 апреля 2020

Ваша else часть не совсем правильная:

  1. вам не нужно искать самый правый индекс, потому что у вас уже есть index
  2. upper никогда не используется
  3. правильный диапазон отключен на один

Вот рабочий вариант:

    # ...
    else
      upper = i.upcase
      result.push("#{str[0...index]}#{upper}#{str[index+1..-1]}")
      index += 1
    end
    # ...

Вы можете использовать each_char и with_index, чтобы сделать ваш код немного более идиоматическим c:

def wave(str)
  result = []
  str.each_char.with_index do |char, index|
    next if char == " "
    result.push("#{str[0...index]}#{char.upcase}#{str[index+1..-1]}")
  end
  result
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...