在密码学中,有一个凯撒密码。我正在尝试在Ruby中构建一个,但我不知道如何在我的范围('a'..'z').to_a.join
中使用大写字母。我如何使用大写字母?
class Caesar
def initialize(shift)
alphabet = ('a'..'z').to_a.join
i = shift % alphabet.size
@decrypt = alphabet
@encrypt = alphabet[i..-1] + alphabet[0...i]
end
def encrypt(string)
string.tr(@decrypt, @encrypt)
end
def decrypt(string)
string.tr(@encrypt, @decrypt)
end
end
cipher_1 = Caesar.new(1)
s = 'A man, a plan, a canal: Panama!'
puts s
s_encoded = cipher_1.encrypt(s)
puts s_encoded
pudaats = cipher_1.decrypt(s_encoded)
puts pudaats
输出
一个男人,一个计划,一个运河:巴拿马!
nbo,b qmbo,b dbobm:Pbobnb!
一个男人,一个计划,一个运河:巴拿马!
但我需要Out Put
一个男人,一个计划,一个运河:巴拿马!
B nbo,b qmbo,b dbobm:Qbobnb!
一个男人,一个计划,一个运河:巴拿马!
答案 0 :(得分:3)
这里的问题在于你所定义的字母表。
a..z # ["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"]
请注意,这里没有大写字母。被转置的唯一字母是小写字母。因此,您需要更改范围以包含大写字符:
alphabet = (("A".."Z").to_a + ("a".."z").to_a).join
然后你会得到正确的结果。
答案 1 :(得分:1)
LOWER_CASE = ('a'.ord .. 'z'.ord)
UPPER_CASE = ('A'.ord .. 'Z'.ord)
def shift(c, by)
byte = c.ord
if LOWER_CASE.include?(byte) then
((((byte - LOWER_CASE.min) + by) % 26) + LOWER_CASE.min).chr
elsif UPPER_CASE.include?(byte) then
((((byte - UPPER_CASE.min) + by) % 26) + UPPER_CASE.min).chr
else
c
end