我正在尝试用ord中的某个数字替换字符串中的字符。我认为最好的方法是使用正则表达式,但遇到一些问题。
这是我所拥有的有缺陷的代码
def cipher(coded_message)
coded_message=coded_message.downcase.split("")
new_message=[]
coded_message.each do |x|
x=x.gsub(/[a-d][e-z]/, '\1x.ord+22\2x.ord-4')
new_message<<x
end
p new_message.join
end
我知道我的问题在于正则表达式,可能还有替换文本,但不知道在哪一步。任何帮助将不胜感激。
答案 0 :(得分:3)
好的,所以我采取了不同的方法来解决你的问题。这是一个不涉及regex
的解决方案,并且非常灵活。
def cipher(coded_message)
new_message=[]
coded_message.downcase.each_char do |x|
case x
when ("a".."d")
new_message << (x.ord+22).chr
when ("e".."z")
new_message << (x.ord-4).chr
end
end
new_message.join
end
cipher("Code this string")
#=> "ykzapdeoopnejc"
答案 1 :(得分:1)
如果您无法对其进行解码,则无法对邮件进行编码:
@code_key = 123.times.with_object({}) do |i,h|
c = i.chr
h[c] =
case c
when /[a-dA-D]/
(i+22).chr
when /[e-zE-Z]/
(i-4).chr
else
c
end
end
@decode_key = @code_key.invert
def code(message)
@code_key.values_at(*message.chars).join
end
def decode(message)
@decode_key.values_at(*message.chars).join
end
message = "Is 42 an important number?"
coded_message = code(message) # => "Eo 42 wj eilknpwjp jqixan?"
decoded_message = decode(coded_message) # => "Is 42 an important number?"