凯撒密码-红宝石

时间:2020-06-08 22:42:59

标签: ruby caesar-cipher

我必须创建一个接收短语并将其加密的函数。密码是针对字母中的每个字母,加密后的字母比字母前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

3 个答案:

答案 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!"
相关问题