Ruby方法,甚至索引字母和小写奇数

时间:2017-09-11 02:23:00

标签: ruby string

路线:

编写一个接受字符串的方法,并返回相同的字符串,其中包含每个单词大写的所有偶数索引字符,并且每个单词中的所有奇数索引字符都更低。刚解释的索引是基于零的,所以零第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

2 个答案:

答案 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_charwith_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"