编写一个接受字符串的方法,并返回相同的字符串,其中包含每个单词大写的所有偶数索引字符,并且每个单词中的所有奇数索引字符都更低。刚解释的索引是基于零的,所以零第i个索引是偶数,因此该字符应该是大写的。
传入的字符串只包含字母字符和空格('')。只有在有多个单词时才会出现空格。单词将由单个空格('')分隔。
(有人请重构或向我解释更清洁/更短的解决方案)
def weirdcase(string)
arr = string.split(' ')
arr.map! {|word|
char = word.chars
char.each_with_index do |letter, i|
i % 2 == 0 ? letter.upcase! : letter.downcase!
end
}
arr.map! {|a| a.push(' ').join('')}
x = arr.join('').to_s
x[0...-1]
end
答案 0 :(得分:3)
这是您可以这样做的一种方法,使用Array#cycle创建枚举器,String#gsub替换字符串中的每个字符,其值上升或下移。
def weirdcase(str)
enum = [:upcase, :downcase].cycle
str.gsub(/./) do |s|
if s == ' '
enum.rewind
s
else
s.public_send(enum.next)
end
end
end
weirdcase "Mary had a little lamb"
#=> "MaRy hAd a lItTlE LaMb"
通过使gsub
的参数/./
,字符串中的每个字符都被块返回的值替换,如果该字符不是空格,则该字符也是该字符根据枚举器enum
生成的符号,取决于每个单词:upcase
和:downcase
之间的符号。
请注意
enum = [:upcase, :downcase].cycle
#=> #<Enumerator: [:upcase, :downcase]:cycle>
enum.next
#=> :upcase
enum.next
#=> :downcase
enum.next
#=> :upcase
等等。另请参阅Enumerator#next。
Enumerator#rewind需要重新开始每个单词的案例交替。
可以用
替换s.public_send(enum.next)
enum.next == :upcase ? s.upcase : s.downcase
答案 1 :(得分:1)
您也可以使用gsub
一次更改两个相邻的字符:
def weirdcase(string)
string.gsub(/(.)(.?)/) { "#{$1.upcase}#{$2.downcase}" }
end
weirdcase "Mary had a little lamb"
#=> "MaRy hAd a lItTlE LaMb"
?
使第二个字符成为可选,这是奇数长度字符串所需的:
weirdcase "foo"
#=> "FoO"
或使用each_char
和with_index
:
def weirdcase(string)
string.each_char.map.with_index { |char, index|
if index.odd?
char.downcase
else
char.upcase
end
}.join
end
如果您想分别更改每个单词:
"Mary had a little lamb".split(' ').map { |word| weirdcase(word) }.join(' ')
#=> "MaRy HaD A LiTtLe LaMb"
或再次使用gsub
:
"Mary had a little lamb".gsub(/\S+/) { |word| weirdcase(word) }
#=> "MaRy HaD A LiTtLe LaMb"