Задача
Юлий Цезарь использовал свой способ шифрования текста. Каждая буква заменялась на следующую по алфавиту через [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 !
