Ruby将字符串中的字母转换为字母表中13个位置的字母

Ruby将字符串中的字母转换为字母表中13个位置的字母,ruby,string,Ruby,String,我试图解决一个问题,当给定一个字符串时,我将每个字母转换为字母表中的13个位置。比如说 a => n b => o c => p 基本上,字符串中的每个字母都转换为13个字母空格 如果给定字符串“句子”,我希望将其转换为 'feagrapr' 我不知道怎么做。我试过了 'sentence'.each_char.select{|x| 13.times{x.next}} 但我还是无法解决它 这个问题困扰了我一段时间,我已经放弃了解决它 我需要你的帮助从这里开始-> 你应该像这

我试图解决一个问题,当给定一个字符串时,我将每个字母转换为字母表中的13个位置。比如说

a => n
b => o
c => p
基本上,字符串中的每个字母都转换为13个字母空格

如果给定字符串“句子”,我希望将其转换为

'feagrapr'
我不知道怎么做。我试过了

'sentence'.each_char.select{|x| 13.times{x.next}}
但我还是无法解决它

这个问题困扰了我一段时间,我已经放弃了解决它

我需要你的帮助

从这里开始->

你应该像这样做:

def increment_char(char)
 return 'a' if char == 'z'
 char.ord.next.chr
end

def increment_by_13(str)
 conc = []
 tmp = ''
 str.split('').each do |c|
   tmp = c
   13.times.map{ |i| tmp = increment_char(tmp) }
   conc << tmp
 end
 conc
end
def增量字符(字符)
如果char==“z”,则返回“a”
char.ord.next.chr
结束
def增量乘以13(str)
浓度=[]
tmp=''
str.split('')。每个都有|
tmp=c
13.times.map{| i | tmp=increment_char(tmp)}
conc从这里开始->

你应该像这样做:

def increment_char(char)
 return 'a' if char == 'z'
 char.ord.next.chr
end

def increment_by_13(str)
 conc = []
 tmp = ''
 str.split('').each do |c|
   tmp = c
   13.times.map{ |i| tmp = increment_char(tmp) }
   conc << tmp
 end
 conc
end
def增量字符(字符)
如果char==“z”,则返回“a”
char.ord.next.chr
结束
def增量乘以13(str)
浓度=[]
tmp=''
str.split('')。每个都有|
tmp=c
13.times.map{| i | tmp=increment_char(tmp)}
conc根据TCSGrad的建议使用是理想的解决方案

一些备选方案:

使用
case
ord
chr
使用
gsub
和哈希进行多次替换 注意,
Array#to_h
需要Ruby 2.1+。对于较旧版本的Ruby,请使用

cipher=Hash[from.zip(to)]

按照TCSGrad的建议使用是理想的解决方案

一些备选方案:

使用
case
ord
chr
使用
gsub
和哈希进行多次替换 注意,
Array#to_h
需要Ruby 2.1+。对于较旧版本的Ruby,请使用


cipher=Hash[from.zip(to)]

IMHO,在惯用Ruby中有一种更好的方法来实现这一点:

def rot13(string)
  string.tr("A-Za-z", "N-ZA-Mn-za-m")
end

这是因为参数13在OP的问题中是硬编码的,在这种情况下,
tr
函数似乎正是该作业的合适工具

IMHO,在惯用Ruby中有一种更好的方法来实现这一点:

def rot13(string)
  string.tr("A-Za-z", "N-ZA-Mn-za-m")
end

这是因为参数13在OP的问题中是硬编码的,在这种情况下,
tr
函数似乎正是该作业的合适工具

很好!很高兴提供帮助:)只需
char即可。下一步就可以了。实际上,这一切都是非常草率和不惯用的。这是您需要的单个函数的全部内容,去掉
increment\u char
<代码>def增量乘以13(str);13.times{str=str.chars.map{c | c=='z'?'a':c.next}.join;};str;结束
酷!好得多,干净得多。我更担心的是给出答案而不是重构,但我应该这么做。很高兴你喜欢我的基本代码:)很好!很高兴提供帮助:)只需
char即可。下一步就可以了。实际上,这一切都是非常草率和不惯用的。这是您需要的单个函数的全部内容,去掉
increment\u char
<代码>def增量乘以13(str);13.times{str=str.chars.map{c | c=='z'?'a':c.next}.join;};str;结束
酷!好得多,干净得多。我更担心的是给出答案而不是重构,但我应该这么做。很高兴你喜欢我的“基本代码:)我喜欢这两种解决方案。首先,您不需要
c=
,一个变体是将
chars.map
替换为
gsub(/。/)
,在这种情况下,您不需要
join
。我喜欢这两种解决方案。在第一种情况下,您不需要
c=
,一种变体是将
chars.map
替换为
gsub(/。/)
,在这种情况下,您不需要
加入