Ruby 用字母表中的下列字母替换给定字符串中的每个字母
我必须用字母表中紧跟其后的字母替换字符串中的每个字母,即c变为d,z变为a,将每个元音a、e、I、o、u大写,然后返回修改后的字符串。我试图在不调用任何函数(如sort或find)的情况下找到解决方案 我有这个:Ruby 用字母表中的下列字母替换给定字符串中的每个字母,ruby,string,Ruby,String,我必须用字母表中紧跟其后的字母替换字符串中的每个字母,即c变为d,z变为a,将每个元音a、e、I、o、u大写,然后返回修改后的字符串。我试图在不调用任何函数(如sort或find)的情况下找到解决方案 我有这个: def LetterChanges(str) Changed_Letter = "" alphabet = [a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z] for i in 0..str.length do
def LetterChanges(str)
Changed_Letter = ""
alphabet = [a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z]
for i in 0..str.length do
if str[i] ==
str[i] = alphabet[i] + 1
return str
end
但是我迷路了。非常感谢您的帮助。您可以试试这个,它将用下面的字母替换一个字母,也将大写元音
def letter_changes(str)
alphabets = ('a'..'z').to_a
vowels = ["a","e","i","o","u"]
for i in 0..(str.length-1) do
index = (alphabets.index(str[i]) == (alphabets.size - 1) ? 0 : (alphabets.index(str[i]) + 1))
str[i] = alphabets[index]
str[i] = str[i].upcase if vowels.include?(str[i])
end
puts str
end
## call function
letter_changes("cadcarz")
## OUTPUT
dbEdbsA
要求您将字母表中的每个字母映射到另一个字母,因此您需要使用该方法 您可以使用case语句和Ruby的: 或者,您可以使用以下方法: 例如,如果c='r' 但是,如果c='z' 还有一条路。你可以弄清楚为什么这样做
letters.map do |c|
s = c.succ[0]
VOWELS.include?(s) ? s.upcase : s
end
您可能希望创建一个散列
letter_mapping = {}
letters.each do |c|
s = c.succ[0]
letter_mapping[c] = VOWELS.include?(s) ? s.upcase : s
end
letter_mapping
#=> { "a"=>"b", "b"=>"c", "c"=>"d", "d"=>"E", "e"=>"f", "f"=>"g", "g"=>"h",
# "h"=>"I", "i"=>"j", "j"=>"k", "k"=>"l", "l"=>"m", "m"=>"n", "n"=>"O",
# "o"=>"p", "p"=>"q", "q"=>"r", "r"=>"s", "s"=>"t", "t"=>"U", "u"=>"v",
# "v"=>"w", "w"=>"x", "x"=>"y", "y"=>"z", "z"=>"A"}
例如,字母_映射['r']=>s
随着时间的推移,你会发现Ruby的写作方式是:
letters.each_with_object({}) do |c, letter_mapping|
s = c.succ[0]
letter_mapping[c] = VOWELS.include?(s) ? s.upcase : s
end
#=> { "a"=>"b", ... "z"=>"A"}
最后一件事。Enumerablemap是包含可枚举模块的每个类的实例方法。其中一类是数组:
数组使用了所有模块枚举的方法,就像它们是在数组中定义的一样。这就是当接收器是阵列时map工作的原因
另一个包含可枚举的类是:
因此,与其写:
letters = ('a'..'z').to_a
我们可以这样写:
letters = ('a'..'z')
以上所有代码都可以正常工作。jtbandes您是如何将我的答案放入这样一个漂亮的灰色方框中的?欢迎使用堆栈溢出。请阅读和链接页面,以及。我们期待更多信息:描述您期望的输出以及当前的输出。你遇到了什么问题?您的代码在语法上不正确,因此您应该首先处理它。一旦你的代码被Ruby解释器接受为语法正确,那么你就可以在一个更好的地方提问了?重新发明经过良好测试和优化的车轮?虽然这是一个好主意,但当您第一次学习编程时,它并不实用。了解算法非常有用,但我建议您学习使用现有的工具,随着时间的推移,您将了解如何构建这些工具,并可以尝试构建自己的工具。但是,请始终注意,需要使用现有的控制盘/方法/函数代码,因为它是多年来编写和优化的,以处理您无法预料的问题。下午好,我的程序员同事。首先也是最重要的,感谢你在这个过程中指导我。正如你可能注意到的,我甚至不知道如何提问。这就是我迷路的原因:我试图把一个单词变成一个新词,用字母表中的下一个字母替换每个字母。例如:abc->bcdIf你要给ruby建议,就要做对。1.命名约定未更正。2.每个/每个带有索引的_应优先于。3.不必要的破坏性事件!此外,三元运算符可以替换为简单的%运算符。
('a'.ord + ((c.ord-'a'.ord+1) % 26).chr
#=> (97 + ((122-97+1) % 26).chr
#=> (97 + 26 % 26).chr
#=> (97 + 0).chr
#=> 97.chr
#=> 'a'
letters.map do |c|
s = c.succ[0]
VOWELS.include?(s) ? s.upcase : s
end
letter_mapping = {}
letters.each do |c|
s = c.succ[0]
letter_mapping[c] = VOWELS.include?(s) ? s.upcase : s
end
letter_mapping
#=> { "a"=>"b", "b"=>"c", "c"=>"d", "d"=>"E", "e"=>"f", "f"=>"g", "g"=>"h",
# "h"=>"I", "i"=>"j", "j"=>"k", "k"=>"l", "l"=>"m", "m"=>"n", "n"=>"O",
# "o"=>"p", "p"=>"q", "q"=>"r", "r"=>"s", "s"=>"t", "t"=>"U", "u"=>"v",
# "v"=>"w", "w"=>"x", "x"=>"y", "y"=>"z", "z"=>"A"}
letters.each_with_object({}) do |c, letter_mapping|
s = c.succ[0]
letter_mapping[c] = VOWELS.include?(s) ? s.upcase : s
end
#=> { "a"=>"b", ... "z"=>"A"}
Array.included_modules
#=> [Enumerable, Kernel]
Array.instance_methods.include?(:map)
#=> true
Range.included_modules
#=> [Enumerable, Kernel]
Range.instance_methods.include?(:map)
#=> true
letters = ('a'..'z').to_a
letters = ('a'..'z')