将元音推进Ruby中的下一个元音

时间:2016-05-16 17:51:41

标签: ruby string

我正在研究初学者Ruby教程。我正在尝试编写一种方法,将元音推进到下一个元音。 'a'将成为'e','e'将成为'i','u'将成为'a'等等。我已经尝试了很长一段时间的各种想法,但无济于事。

我认为我在正确的轨道上需要创建一个元音数组,然后使用索引将它们推进到元音中的下一个数组。我似乎无法创建正确的方法。

我知道这不是可行的代码,但我的大纲是这些。遇到问题的地方是让我的代码识别每个元音,并将其推进到下一个元音:

def vowel_adv(str)
    vowels = ["a", "e", "i", "o", "u"]

    str = str.split('')
    **str_new = str.map do |letter| 
    if str_new.include?(letter)
        str_new = str_new[+1]
    end**
    # The ** section is what I know I need to find working code with, but keep hitting a wall.
    str_new.join
end

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:5)

因为我们只有几个元音,所以我首先要定义一个包含元音键和元音值的哈希值:

vowels_hash = {
  'a' => 'e',
  'A' => 'E',
  'e' => 'i',
  'E' => 'I',
  'i' => 'o',
  'I' => 'O',
  'o' => 'u',
  'O' => 'U',
  'u' => 'a',
  'U' => 'A'
}

然后我将遍历每个单词/句子中出现的字母,如下所示:

word.split(//).map do |character|
  vowels_hash[character] || character
end.join

<强>更新

BTW而不是拆分这个词,你也可以使用gsub和正则表达式+哈希参数,如下所示:

word.gsub(/[aeiouAEIOU]/, vowels_hash)

或者如果你想成为Fancy Pants先生/女士那么喜欢:

regex = /[#{vowels_hash.keys.join}]/
word.gsub(regex, vowels_hash)

答案 1 :(得分:4)

在这里,您的代码需要最少的更正才能使其正常工作:

def vowel_adv(str)
  vowels = ["a", "e", "i", "o", "u"]
  str = str.split('')
  str_new = str.map do |char|
    if vowels.include?(char)
      vowels.rotate(1)[vowels.index(char)]
    else
      char
    end
  end
  str_new.join
end
vowel_adv "aeiou"
=> "eioua"

我改变的事情包括

  • 将块变量添加到map
  • 返回您从map
  • 映射到的内容
  • include?Array上调用,而不是在可能的元素上调用
  • 通过查看元音数组找到下一个元音,而不是通过递增字符,这就是我认为你想要做的事情。

这是一个改进版本:

VOWELS = %w(a e i o u)
ROTATED_VOWELS = VOWELS.rotate 1

def vowel_adv(str)
  str.
    chars.
    map do |char|
      index = VOWELS.index char
      if index
        ROTATED_VOWELS[index]
      else
        char
      end
    end.
    join
end
  • 常量中的静态Array
  • 更好的字符串数组语法
  • String#chars代替split
  • 使用索引测试包含而不是include?
  • 没有参数分配,这有点令人困惑
  • 没有临时变量,有些人喜欢,有些人不喜欢,但我已经在这里表明它可能

而且,仅仅因为Ruby很有趣,这里有一个不同的版本,可以复制字符串并修改副本:

VOWELS = %w(a e i o u)
ROTATED_VOWELS = VOWELS.rotate 1

def vowel_adv(str)
  new_str = str.dup
  new_str.each_char.with_index do |char, i|
    index = VOWELS.index char
    if index
      new_str[i] = ROTATED_VOWELS[index]
    end
  end
  new_str
end

答案 2 :(得分:3)

字符串类有一个nice method。演示:

p "Oh, just a test".tr("aeiouAEIOU", "uaeioUAEIO") # => "Ih, jost u tast"

答案 3 :(得分:0)

对steenslag的回答有点回答。

VOWELS = %w{a e i o u A E I O U} 
SHIFTED_VOWELS = VOWELS.rotate 1

def vowel_shifter input_string
  input_string.tr!(VOWELS.join, SHIFTED_VOWELS.join)
end

只是为了好玩,辅音:

CONSONANTS = ('a'..'z').to_a + ('A'..'Z').to_a - VOWELS
SHIFTED_CONSONANTS = CONSONANTS.rotate 1

def consonant_shifter input_string
  input_string.tr!(CONSONANTS.join, SHIFTED_CONSONANTS.join)
end