我正在尝试创建一个函数,该函数采用混乱的字母序列并返回英语。出于某种原因,我无法让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!')
答案 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_str
比from_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
...