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