Ruby将字母串中的字母转换为字母13中的字母

时间:2014-06-22 00:04:36

标签: ruby string

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

a => n
b => o
c => p

基本上,字符串中的每个字母都被转换为13个字母空格。

如果给出字符串'句子'我希望转换为

'feagrapr'

我不知道该怎么做。我试过了

'sentence'.each_char.select{|x| 13.times{x.next}}

我仍然无法解决它。

这一次让我困惑了一段时间,我已经放弃了试图解决它。

我需要你的帮助

3 个答案:

答案 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建议是理想的解决方案。

一些替代方案:

使用caseordchr

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

或关闭。