我正在研究初学者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
非常感谢任何帮助。
答案 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