как увеличить ascii ord на значение ключа - PullRequest
1 голос
/ 23 января 2020

Я хочу зашифровать строку путем увеличения ASCII на значение ключа. Но с этим кодом у меня возникла проблема.

def caesar_cipher(str, key)
    new_sentence = []
    str.split("").each do |letter|
        ascii = letter.ord
        puts ascii

        ascii += key if ascii >= 65 && ascii <= 90
        if ascii > 90
            return_start = ascii - 90
            ascii = 64 + return_start
        end

        ascii += key if ascii >= 97 && ascii <= 122
        if ascii > 122
            return_start = ascii - 122
            ascii = 96 + return_start
        end
        puts ascii


        new_sentence << ascii.chr

    end

    puts new_sentence
end

caesar_cipher("Wh", 5)

Я положил puts, чтобы посмотреть, что произойдет, и когда я puts ascii, я увижу, что мне не вернулось хорошее число. Для «W» все хорошо. Он начинает с 87 и go до 66. Но я не понимаю, почему у 'h' есть проблема. Он начинает с 104 и go до 78. Почему он не go до 109?

1 Ответ

1 голос
/ 23 января 2020

Краткий ответ: потому что вы сказали это.

if ascii > 90               # "h".ord == 104 so this is true
  return_start = ascii - 90 # return_start is now 14
  ascii = 64 + return_start # ascii is now 64 + 14 (78)
                            # Note this is  a elaborate way of subtracting 26 from ascii
end

При таком кодировании попытайтесь напечатать промежуточные значения и результаты, используя p:

if ascii > 90
  p  return_start = ascii - 90
  p  ascii = 64 + return_start
end
...