По сути, я слежу за программой Challenge Encryptor лаборатории Jumpstart и столкнулся с некоторыми проблемами.
Вот мой код
class Encryptor
def cipher(rotation)
characters = (' '..'z').to_a
rotated_characters = characters.rotate(rotation)
Hash[characters.zip(rotated_characters)]
end
def encrypt_letter(letter, rotation)
cipher_for_rotation = cipher(rotation)
cipher_for_rotation[letter]
end
def encrypt(string, rotation)
letters = string.split("")
results = letters.collect do |letter|
encrypt_letter = encrypt_letter(letter, rotation)
end
results.join
end
def decrypt_letter(letter, rotation)
cipher_for_rotation = cipher(rotation)
reversed_cipher = cipher_for_rotation.to_a.reverse.to_h
reversed_cipher[letter]
end
def decrypt(string, rotation)
letters = string.split("")
results = letters.collect do |letter|
decrypt_letter = decrypt_letter(letter, rotation)
end
results.join
end
end
У меня возникают трудности с моим методом расшифровки. Вот следующее наклеено из irb
2.3.0 :001 > load './encryptor.rb'
=> true
2.3.0 :002 > e = Encryptor.new
=> #<Encryptor:0x007fe93a0319b8>
2.3.0 :003 > encrypted = e.encrypt("Hello, World!", 10)
=> "Rovvy6*ay!vn+"
2.3.0 :004 > e.decrypt(encrypted, 10)
=> "\\y%%(@4k(+%x5"
Как видите, при расшифровке моей зашифрованной строки она должна выводить «Hello, World!», то, чем я ее зашифровал, с поворотом 10. Не вижу, что я здесь делаю неправильно, любая помощь будет оценена по достоинству. .
decrypt(10)
совпадает сencrypt(-10)
, который, в свою очередь, совпадает сencrypt(17)
(при условии, что алфавит состоит из 27 букв). В более общем планеdecrypt(N) == encrypt(-N) == encrypt(alphabet.size - N)
. - person Jörg W Mittag   schedule 21.02.2017cipher_for_rotation.to_a.reverse.to_h
. Вы превращаете словарь в массив, переворачиваете массив (т.е. меняете порядок словаря), а затем снова превращаете его в словарь. Но для словарей порядок не имеет значения, так что в итоге вы получите тот же словарь, с которого начали. Чтобы быть более точным: RubyHash
es do сохраняет порядок вставки ключей и гарантированно выполняет итерацию в этом порядке, поэтому вы сделали обратный порядок вставки (и, следовательно, обратный порядок итерации). Но вы никогда не перебираете хэш, вы получаете доступ только к его значениям. - person Jörg W Mittag   schedule 21.02.2017