2014-09-28 2 views
0

В криптографии есть шифр Цезаря. Я пытаюсь построить его в Ruby, но я не знаю, как использовать заглавные буквы в моем диапазоне ('a'..'z').to_a.join. Как использовать заглавные буквы?В криптографии шифр Цезаря Ruby

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 

Выходной

Человек, план, канал: Панама!

A nbo, b qmbo, b dbobm: Pbobnb!

Человек, план, канал: Панама!

Но мне нужно из положить

Человек, план, канал: Панама!

B nbo, b qmbo, b dbobm: Qbobnb!

Человек, план, канал: Панама!

+0

Похоже, домашнее задание для меня. –

+0

Что вы думаете? – sawa

+0

@sawa: Вопрос в том, что он не переносит заглавные буквы. –

ответ

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

Тогда вы получите правильный результат.

+0

спасибо :) Я новичок в рубине – 2014-09-29 00:02:58

Смежные вопросы