如何在循环中正确使用.ord和.chr?

时间:2014-05-14 07:00:49

标签: ruby algorithm

我正在尝试创建一个函数,该函数采用混乱的字母序列并返回英语。出于某种原因,我无法让word = (word.ord-4).chr正常工作。代码的秘密在于字母向后移动4个槽,这就是为什么我先将它转换为整数,减去4,然后将其转回字符串。

循环似乎也忽略了我告诉它跳过一个单词的事实,如果它是任何一个特殊字符。我做错了什么?

任何可以让我更接近解决这个问题的建议或来源?

def north_korean_cipher(coded_mesage)
  input = coded_mesage.split('') # splits the coded message into array of letters

  input.each do |word|
    word = (word.ord - 4).chr

    if word == '@' || '#' || '$' || '%' || '^' || '&' || '*'
      next
    end
  end

  print input
end

north_korean_cipher('m^aerx%e&gsoi!')

2 个答案:

答案 0 :(得分:2)

你想要这样的映射:

input:  abcdefghijklmnopqrstuvwxyz
output: wxyzabcdefghijklmnopqrstuv

不幸的是,你的方法并不适用于前4个字母:

("a".ord - 4).chr #=> "]"
("b".ord - 4).chr #=> "^"
("c".ord - 4).chr #=> "_"
("d".ord - 4).chr #=> "`"

我使用String#tr。它将第一个字符串中的每个匹配项替换为第二个字符串中的相应字符:

"m^aerx%e&gsoi!".tr("abcdefghijklmnopqrstuvwxyz", "wxyzabcdefghijklmnopqrstuv")
#=> "i^want%a&coke!"

还有" c1-c2表示法来表示字符范围"

"m^aerx%e&gsoi!".tr("a-z", "w-za-v")
#=> "i^want%a&coke!"

文件进一步说:

  

如果to_strfrom_str短,则会用最后一个字符填充,以保持通信。

因此它可以用来轻松替换"特殊字符"有空格:

"m^aerx%e&gsoi!".tr("a-z@#$%^&*", "w-za-v ")
#=> "i want a coke!"

答案 1 :(得分:1)

此:

if word == '@' || '#' || '$' || '%' || '^' || '&' || '*'

没有按预期执行,因为'#'作为条件始终为true。你无法比较那样的对象。你应该做点什么

if word == '@' || word == '#' || word == '$' || word == '%' || word == '^' || word == '&' || word == '*'

您可以通过询问:

以更简洁的方式撰写
if %w(@ # $ % ^ & *).include? word

检查选项集合中是否word ...