Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 用字母表中的下列字母替换给定字符串中的每个字母_Ruby_String - Fatal编程技术网

Ruby 用字母表中的下列字母替换给定字符串中的每个字母

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

我必须用字母表中紧跟其后的字母替换字符串中的每个字母,即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 
    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')