凯撒密码-红宝石

问题描述 投票:-1回答:4

我必须制作一个接收短语并将其加密的函数。密码是针对字母中的每个字母,加密的字母前面是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'应该被加密为'}'。

以下是我用来解决此问题的代码:


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

ruby caesar-cipher
4个回答
2
投票

对于注释中提到的加密,请使用String.tr方法

我必须制作一个接收短语并将其加密的函数。的 密码是字母中的每个字母,加密后的字母是3个字母 向前。

phrase = "abcd st xyz"

encrypted = phrase.tr("A-Za-z ", "D-ZA-Cd-za-c#")

# => "defg#vw#abc"

更新

[请注意,字母'z'(在该短语的末尾)表示 '}'

您可以将z字符显式映射到}

phrase = "prefiro perder a guerra e ganhar a paz"

encrypted = phrase.tr("A-Ya-y z", "D-YA-Cd-ya-c#}")

# => "suhilur#shughu#d#jxhuud#h#jdqkdu#d#sd}"

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"]

0
投票

嗨,谢谢您的帮助。我必须创建一个接收短语并将其加密的函数。密码是针对字母中的每个字母,加密后的字母位于3个字母之前。范例:我们的字母:A B C D E F G ... X Y Z加密: D E F G H I J ... A B C

并且#表示接收到的短语中的空格。


0
投票

给出一个字母:

alphabet = ('A'..'Z').to_a
#=> ["A", "B", "C", "D", "E", ..., "V", "W", "X", "Y", "Z"]

您可以通过调用rotate创建加密的密码:

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
© www.soinside.com 2019 - 2024. All rights reserved.