我必须创建一个接收短语并将其加密的函数。密码是针对字母中的每个字母,加密后的字母比字母前3个字母。
Alphabet: A B C D E F G ... X Y Z
Ciphered: D E F G H I J ... A B C
如果这是我的Ruby字母:
a = ['a','b','c','d','e']
我需要将其映射到:
a = ['c','d','e','a','b']
我尝试对数组进行两次迭代并删除一些索引,但是我知道我缺少一些东西。
UPDATE ---------------------------------------------- ----------------------
我设法解决了六个测试,在这些测试中我收到一个短语,并且必须根据测试要求进行加密。
收到的词组:prefiro perder a guerra e ganhar a paz
预期短语:suhilur#shughu#d#jxhuud#h#jdqkdu#d#sd}
我意识到,要对短语进行密码处理,我应该将ascii table中的字母位置更改为3个位置。
示例:字母'a'应该被加密为'd',字母'z'应该被加密为'}',并且ascii表中最前面的'space'3位是'#'。>
以下是我用来解决此问题的代码:
def cipher(text)
key = 3
cipher_text = text.chars.map {|x| x.ord}
.map {|x| x+key}
cipher_text.map { |x| x.chr }.join
end
def decipher(text)
key = 3
decipher_text = text.chars.map {|x| x.ord}
.map {|x| x-key}
decipher_text.map { |x| x.chr }.join
end
答案 0 :(得分:2)
对于注释中提到的加密,请使用(*j)++
方法
我必须创建一个接收短语并将其加密的函数。的 密码是字母中的每个字母,加密后的字母是3个字母
String.tr
更新
请注意,字母“ z”(在该短语的末尾)表示 '}'
您可以将phrase = "abcd st xyz"
encrypted = phrase.tr("A-Za-z ", "D-ZA-Cd-za-c#")
# => "defg#vw#abc"
字符显式映射到xyz
{|}
答案 1 :(得分:1)
不确定我是否理解您的问题,但是数据看起来就像您旋转数组中的元素一样。在Ruby中,您可以使用一种特殊的方法。
a = %w[a b c d] #=> ["a", "b", "c", "d"]
a.rotate #=> ["b", "c", "d", "a"]
a #=> ["a", "b", "c", "d"]
a.rotate(2) #=> ["c", "d", "a", "b"]
a.rotate(-3) #=> ["b", "c", "d", "a"]
答案 2 :(得分:0)
给出一个字母:
alphabet = ('A'..'Z').to_a
#=> ["A", "B", "C", "D", "E", ..., "V", "W", "X", "Y", "Z"]
您可以通过调用rotate
来创建加密的密码:
ciphered = alphabet.rotate(3)
#=> ["D", "E", "F", "G", "H", ..., "Y", "Z", "A", "B", "C"]
并创建一个到另一个的映射:
to_cipher = alphabet.zip(ciphered).to_h
#=> {"A"=>"D", "B"=>"E", "C"=>"F", ..., "X"=>"A", "Y"=>"B", "Z"=>"C"}
现在,要加密给定的字符串,我们必须通过该哈希运行每个字符:
'HELLO WORLD!'.each_char.map { |char| to_cipher[char] }.join
#=> "KHOORZRUOG"
好吧,差不多。这也消除了空格和感叹号。我们可以通过为哈希中未出现的字符提供后备选项来解决此问题:
'HELLO WORLD!'.each_char.map { |char| to_cipher.fetch(char, char) }.join
#=> "KHOOR ZRUOG!"
或者,对于使用gsub
的正则表达式:
'HELLO WORLD!'.gsub(Regexp.union(to_cipher.keys), to_cipher)
#=> "KHOOR ZRUOG!"