字符串大写重复。 Ruby

Duplication in string capitalization. Ruby

我是 Ruby 新手,我需要您在以下方面的帮助:

The task is to write a function that would return the following result:

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

It also needs to work on "Two words"

我遇到的问题是字母 '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")

这应该有效:

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) 映射以将索引处的字母大写。最后 returns s 除非当前字符是 space,在这种情况下它是 returns 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
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] : '')}

这是我想出的解决方案

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 的副本压入 Arrayarr << "#{s}"),然后替换字符str[i] 现在大写版本 (arr.last[i] = l)