Задача
Юлий Цезарь использовал свой способ шифрования текста. Каждая буква заменялась на следующую по алфавиту через [latex]k[/latex] позиций по кругу. Необходимо по заданной шифровке определить исходный текст.
Входные данные
В первой строке дана шифровка, состоящая из не более чем 255 заглавных латинских букв. Во второй строке число [latex]k (1[/latex] [latex]\leq[/latex] [latex]k[/latex] [latex]\leq[/latex] [latex]10)[/latex].
Выходные данные
Требуется вывести результат расшифровки.
Тесты
№ | Входные данные | Выходные данные |
1 | XPSE
1 |
WORD |
2 | ZABC
3 |
WXYZ |
Код программы
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
class Test { static function main() { var cipher:String = Std.parseString(Sys.stdin().readLine()); // зашифрованное сообщение var result:String = ""; var k:Int = Std.parseInt(Sys.stdin().readLine()); // целое число от 1 до 10 (ключ шифрования) for(i in 0...cipher.length) { /* Если полученный символ принадлежит к заглавным латинским буквам, ставим его на место зашифрованного Если нет, то возвращаемся к символу "Z" и отступаем от него на k минус уже пройденное кол-во символов */ if(cipher.charCodeAt(i) >= 'A'.code + k) result += String.fromCharCode(cipher.charCodeAt(i) - k); else result += String.fromCharCode('Z'.code - (k - (cipher.charCodeAt(i) - '@'.code)));// (cipher.charCodeAt(i) - '@'.code) расстояние между i-ым символом и символом 'A', где '@' - символ идущий перед символом 'A' } trace("Encoded: " + cipher); // Выводим зашифрованное сообщение trace("Uncoded: " + result); // Выводим расшифрованное сообщение } } |
Алгоритм решения
Каждая буква строки является элементом массива [latex]cipher[/latex]. Чтобы расшифровать строку нужно от значения [latex]i[/latex]-го элемента массива отнять [latex]k[/latex], тем самым сдвинуть символ на [latex]k[/latex] единиц по алфавиту, и заменить первоначальный символ на полученный результат. В случае если разница символа [latex]i[/latex]-го элемента и числа [latex]k[/latex] не входит в множество заглавных латинских букв, требуется от символа «Z» отнять оставшееся кол-во шагов [latex]k[/latex] (то есть не считая те которые уже были пройдены от изначального символа символа до крайнего символа «A»), и заменить первоначальный символ на полученный результат. Можно не беспокоиться о том, что символ вернется к «Z» более чем один раз так как условие исключает этот вариант ([latex]k<=10[/latex] при 26-ти символах латинского алфавита).
Используя цикл, повторяющийся столько же, сколько символов в строке [latex]cipher[/latex], требуется применить описанный алгоритм к каждому элементу массива и добавить результат в строку [latex]result[/latex]. По окончанию работы цикла, вывести строку result, содержащую уже расшифрованные символы.
- Ссылка на условие задачи.
- Решение задачи на С++.
- Решение задачи на Try Haxe !