Это должно работать:
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