我试图解决一个问题,当给定一个字符串时,我将每个字母转换为字母表中的13个位置。例如
a => n
b => o
c => p
基本上,字符串中的每个字母都被转换为13个字母空格。
如果给出字符串'句子'我希望转换为
'feagrapr'
我不知道该怎么做。我试过了
'sentence'.each_char.select{|x| 13.times{x.next}}
我仍然无法解决它。
这一次让我困惑了一段时间,我已经放弃了试图解决它。
我需要你的帮助
答案 0 :(得分:4)
恕我直言,有一种更好的方法可以在惯用的Ruby中实现同样的目标:
def rot13(string)
string.tr("A-Za-z", "N-ZA-Mn-za-m")
end
这是有效的,因为参数13在OP的问题中是硬编码的,在这种情况下,tr
函数似乎只是工作的正确工具!
答案 1 :(得分:1)
使用String#tr
作为TCSGrad建议是理想的解决方案。
一些替代方案:
case
,ord
和chr
word = 'sentence'
word.gsub(/./) do |c|
case c
when 'a'..'m', 'A'..'M' then (c.ord + 13).chr
when 'n'..'z', 'N'..'Z' then (c.ord - 13).chr
else c
end
end
gsub
和多次替换的哈希word = 'sentence'
from = [*'a'..'z', *'A'..'Z']
to = [*'n'..'z', *'a'..'m', *'N'..'Z', *'A'..'M']
cipher = from.zip(to).to_h
word.gsub(/[a-zA-Z]/, cipher)
注意,Array#to_h
需要Ruby 2.1+。对于旧版本的Ruby,请使用
cipher = Hash[from.zip(to)]
。
答案 2 :(得分:-1)
从这里开始 - > How do I increment/decrement a character in Ruby for all possible values?
你应该这样做:
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
或关闭。