Ruby 凯撒密码-红宝石

Ruby 凯撒密码-红宝石,ruby,caesar-cipher,Ruby,Caesar Cipher,我必须创建一个函数来接收短语并对其进行加密。密码是针对字母表中的每个字母的,加密的字母在前面3个字母 例子 如果这是我的Ruby字母表: a = ['a','b','c','d','e'] 我需要将其映射到: a = ['c','d','e','a','b'] 我已经尝试迭代两次数组并删除一些索引,但我知道我遗漏了一些东西 更新-------------------------------------------------------------------- 我已经设法解决了六个测试,

我必须创建一个函数来接收短语并对其进行加密。密码是针对字母表中的每个字母的,加密的字母在前面3个字母

例子 如果这是我的Ruby字母表:

a = ['a','b','c','d','e'] 
我需要将其映射到:

a = ['c','d','e','a','b']
我已经尝试迭代两次数组并删除一些索引,但我知道我遗漏了一些东西

更新--------------------------------------------------------------------

我已经设法解决了六个测试,在这六个测试中,我收到一个短语,并且必须根据测试要求进行加密

收到的短语:prefiro perder a guerra e ganhar a paz
预期短语:suhilur#shughu#d#jxhuud#h#jdqkdu#d#sd}

我意识到要对短语进行加密,我应该将字母的位置改为前面3个位置

示例:字母“a”应加密为“d”,字母“z”应加密为“}”,并且ascii表中前面3个位置的“空格”为“#”

下面是我用来解决这个问题的代码:


def密码(文本)
键=3
cipher|text=text.chars.map{| x | x.ord}
.map{| x | x+key}
cipher|text.map{| x | x.chr}.join
结束
def解密(文本)
键=3
decipher|u text=text.chars.map{| x | x.ord}
.map{| x | x-key}
破译text.map{| x | x.chr}.join
结束

我不确定是否理解您的问题,但数据看起来像是您旋转了数组中的元素。在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"]

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

我必须创建一个函数来接收短语并对其进行加密。这个 密码是指字母表中的每个字母,加密的字母是3个字母 在前面

更新

请注意字母“z”(在短语末尾)的意思是 “}”

您可以显式地将
xyz
字符映射到
{}

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

encrypted = phrase.tr("A-Wa-wXYZxyz ", "D-WA-Cd-wa-c{|}{|}#")

# => "suhilur#shughu#d#jxhuud#h#jdqkdu#d#sd}"
给定一个字母表:

alphabet = ('A'..'Z').to_a
#=> ["A", "B", "C", "D", "E", ..., "V", "W", "X", "Y", "Z"]
您可以通过调用以下命令创建加密文件:

并创建从一个到另一个的映射:

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!"
或者,正则表达式使用:


映射背后的逻辑是什么?可能是
a.rotate(2)
?您好,谢谢您的帮助。我必须创建一个函数来接收短语并对其进行加密。密码是针对字母表中的每个字母的,加密的字母在前面3个字母。例:我们的字母表:A B C D E F G…X Y Z加密:。De F G H I J…A B C和#在接收到的短语中表示空格。@Italofasanellieomil:我已经尝试迭代两次数组并删除一些索引,但我知道我遗漏了一点:在你的问题中,我没有看到任何代码进行迭代。如果我看不到你已经有了什么,我怎么能告诉你你缺少了什么?嗨,Fabio,你的解决方案在6个测试中的4个测试中运行良好。但剩下的两个测试有点棘手。这个短语是“游击队的前缀”,应该加密为“suhilur#shughu#d#jxhuud#h#jdqkdu#d#sd”。请注意字母“z”(在短语末尾)的意思是“}”。我不知道如何解决这个问题。对不起,我正在努力提高我的英语水平。让我更好地表达,我注意到测试使用的是ASCII表,对于这个任务,我们使用字母+3来加密代码。所以‘A’(1997年12月)是指‘D’(100年12月)
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
D E F H I J K L M N O P Q R T U W X Y Z{code>更糟的是,我需要将“#”放到空间中。将其显式配置为上一个示例将
z
配置为
}
,因为元素将在您可能希望使用的位置旋转。
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!"
'HELLO WORLD!'.gsub(Regexp.union(to_cipher.keys), to_cipher)
#=> "KHOOR ZRUOG!"