ruby caesar cipher byte или char манипуляция

Привет, я пытаюсь создать шифр Цезаря в рубине, но я застрял.
Я могу разбить строку на отдельные символы и поместить в массив. затем сделал новый хеш и сохранил номер char => byte.

в хэше h имеет значение 104. я хотел бы изменить значение + 5. если значение равно 109, как мне также изменить h на m? (104*начало, 105, 106, 107, 108, 109*конец) (ч*начало, и, к, л, л, *конец)

str = "hello world"

str_array = str.chars.to_a

str_hash = Hash.new

str_array.each do |char|
  str_hash[char]= char.bytes
end

print str_hash

{"h"=>[104], "e"=>[101], "l"=>[108], "o"=>[111], " "=>[32], "w"=>[119], "r"=>[114], "d"=>[100]}

person Yi Frank    schedule 21.09.2015    source источник
comment
Привет и добро пожаловать в Stack Overflow. Немного неясно, на какой части вы застряли. Что вы пытались заставить его работать? просто попробовать ничего не сломает, даже если это не сработает. Часто то, о чем вы думаете, просто сработает, а если нет, то сообщение об ошибке расскажет вам о многом.   -  person Taryn East    schedule 21.09.2015
comment
Привет, и спасибо за прием. попробую уточнить.   -  person Yi Frank    schedule 21.09.2015
comment
в хэше h имеет значение 104. я хотел бы изменить значение + 5. если значение равно 109, как мне также изменить h на m? (104*начало, 105, 106, 107, 108, 109*конец) (ч*начало, и, к, л, л, *конец)   -  person Yi Frank    schedule 21.09.2015
comment
Так что же произошло, когда вы попытались добавить этот код и запустить его? то есть: просто попробуйте добавить 5 к h и посмотреть, что произойдет!   -  person Taryn East    schedule 21.09.2015
comment
Хорошо, я сделал это, и это заставляет меня задуматься. Я понял, могу ли я преобразовать char в байт. мне просто нужна команда, чтобы сделать обратное. Я нашел 2 команды: .ord => преобразует char в байт .chr => преобразует байт в символ, спасибо!! я боролся с этим некоторое время   -  person Yi Frank    schedule 21.09.2015


Ответы (1)


То, что вы пытаетесь сделать, немного перебор. Обычно вы сначала генерируете шифр, а затем выполняете поиск по мере перевода.
В Ruby также есть метод rotate для массивов, который делает именно то, что вам нужно.
См. ниже пример кода, который кодирует «hello world». "

original = ('a'..'z').to_a
codes = original.rotate(5)
cipher = {}
original.each_with_index do |c,i|
  cipher[c] = codes[i]
end

str = "hello world"
encoded_str = []
str.split('').each do |c|
  if cipher.key(c)
    encoded_str << cipher[c]
  else
    encoded_str << c
  end
end

puts encoded_str.join('')
person Mircea    schedule 21.09.2015