我正在接受Coderbyte的编程挑战:
使用Ruby语言,使用函数LetterChanges(str)获取传递的str参数,并使用以下算法对其进行修改。将字符串中的每个字母替换为字母表后面的字母(即c变为d,z变为a)。然后大写这个新字符串(a,e,i,o,u)中的每个元音,最后返回这个修改后的字符串。
我的代码如下:
def LetterChanges(str)
alphabet = ('a'..'z').to_a
result = ""
str = str.each_char do |c|
idx = alphabet.find_index(c)
if idx != nil
idx == 25 ? idx = 0 : idx += 1
c = alphabet[idx]
c.upcase! if ["a","e","i","o","u"].include?(c)
end
result << c
end
return result
end
当我运行LetterChanges的代码时(&#34; coderbyte&#34;),它返回&#39; dpEesczUe&#39;。我做了一些测试并实现了alphabet.find_index(&#34; e&#34;)将返回nil。但是,当我运行代码LetterChanges(&#34; eeeee&#34;)时,它会返回&#39; fffff&#39;正如所料。必须有一些我想念的东西,我只能弄清楚是什么!
答案 0 :(得分:4)
你在做:
c = alphabet[idx]
从alphabet
然后执行c.upcase!
将修改alphabet
中的条目,以便在“coderbyte”alphabet[4]
(“e”)的“d”更改为“E”之后所以当你试图在alphabet
中找到“e”时,它就不再存在了。
有很多方法可以稍微修改代码来解决这个问题,但一种方法是更改为使用c = alphabet[idx].dup
或更改为可以使用upcase
代替upcase!
<的方法/ p>
答案 1 :(得分:2)
更简单的实施
def LetterChanges(str)
str.tr('a-z','b-zA').gsub(/[aeiou]/){|c| c.capitalize}
end