如何制作一个字母第一个字母的帽子,第二个字母的非帽子,第三个字母的帽子,第四个字母的非帽子......?

时间:2016-07-02 17:30:08

标签: ruby string

我想改变:

word = "Stackoverflow is awesome!"

成:

"StAcKoVeRfLoW Is aWeSoMe!"

我做了:

result = ""
a = word.length
odd = (1..a).select(&:odd?)
even = (1..a).select(&:even?)
odd.each {|i| even.each {|b| result += word[b].to_s}}
result # => "akvrlwi wsm!akvrlwi wsm!akvrlwi wsm!akvrlwi wsm!akvrlwi wsm!akvrlwi wsm!akvrlwi wsm!akvrlwi wsm!akvrlwi wsm!akvrlwi wsm!akvrlwi wsm!akvrlwi wsm!akvrlwi wsm!"

5 个答案:

答案 0 :(得分:3)

"Stackoverflow is awesome!"
.gsub(/(.)(.)?/){$1.upcase + $2.to_s.downcase}
# => "StAcKoVeRfLoW Is aWeSoMe!"

"Stackoverflow is awesome!"
.gsub(/./).with_index{|s, i| i.even? ? s.upcase : s.downcase}
# => "StAcKoVeRfLoW Is aWeSoMe!"

"Stackoverflow is awesome!"
.gsub(/..?/, &:capitalize)
# => "StAcKoVeRfLoW Is aWeSoMe!"

答案 1 :(得分:2)

以下是一些尚未提及的方法。

text = "Stackoverflow is awesome!"

text.downcase.dup.tap { |t| (0...t.size).step(2) { |i| t[i] = t[i].upcase } }
  #=> "StAcKoVeRfLoW Is aWeSoMe!"

e = [:upcase, :downcase].cycle
"Stackoverflow is awesome!".gsub(/./) { |c| c.send e.next }
  #=> "StAcKoVeRfLoW Is aWeSoMe!"

如果text包含大写和小写字母的混合,则这两种方法都有效。

答案 2 :(得分:1)

可能有更聪明的方法可以做到这一点,但我认为这是最清楚的方法之一:

text = "Stackoverflow is awesome!"

for i in 0...text.length do
  if i.even?
    text[i] = text[i].upcase
  else
    text[i] = text[i].downcase
  end
end

puts text

# Output:
# StAcKoVeRfLoW Is aWeSoMe!

答案 3 :(得分:1)

while ans = False:

<强>更新

删除了对第二个正则表达式匹配的依赖,就像Sawa的回答一样。

word = "Stackoverflow is awesome!"
word.scan(/(.)(.)/).inject('') {|s,(x,y)| s << x.upcase << y.downcase}
# => "StAcKoVeRfLoW Is aWeSoMe"

答案 4 :(得分:1)

试试这个:

word.downcase.chars.map.with_index { |c,i| i%2==0 ? c.upcase : c }.join
#=> "StAcKoVeRfLoW Is aWeSoMe!"