правильно использовать метод String # tr? - PullRequest
0 голосов
/ 01 июля 2018

Новичок в Crystal-lang, я на самом деле пытаюсь кодировать шифр Цезаря. Проблема в том, что когда я ввожу строку для кодирования, программа показывает ту же строку без изменений.

if ARGV.size < 3
  puts "./caesarcipher [ed] [text] [num]"
  exit
end

letter = ARGV[0]
str = ARGV[1]
n = ARGV[2].to_i
alphabet = ("A".."Z").to_a

case letter
when "e" then puts str.tr(alphabet.join, alphabet.rotate(n).join)
when "d" then puts str.tr(alphabet.join, alphabet.rotate(n * -1).join)
else          puts "./caesarcipher [ed] [text] [num]"
end

Поскольку два аргумента в методе tr содержат то, что я хочу, и tr должен возвращать значение, я не понимаю, почему ничего не меняется.

1 Ответ

0 голосов
/ 01 июля 2018

Добро пожаловать в переполнение стека!

Причина, по которой это не сработало для вас, заключается в том, что если вы изучите массив alphabet, то на самом деле это будут только заглавные буквы. Таким образом, в вашем переводе вы переводите только символы верхнего регистра. Если вы вместо этого измените

alphabet=("a".."z").to_a

, который будет переводиться для строчных букв.

Если вы хотите сделать и то, и другое, то я бы предложил создать два "алфавита", один с прописными буквами, а другой - с строчными буквами, а затем дважды применить перевод к строке, один с прописными буквами, а другой с строчными буквами.

...