Створіть реалізацію шифру обертання, який іноді ще називають шифром Цезаря.
Шифр Цезаря - це простий шифр зсуву, який ґрунтується на перестановці всіх літер алфавіту за допомогою ключа у вигляді цілого числа від 0 до 26.
Використання ключа 0 або 26 завжди дає той самий результат через модульну арифметику.
Літера зсувається на стільки значень, скільки дорівнює значення ключа.
Загальне позначення для шифрів обертання - ROT + <key>.
Найпоширеніший шифр обертання - ROT13.
ROT13 для латинського алфавіту має такий вигляд:
Plain: abcdefghijklmnopqrstuvwxyz
Cipher: nopqrstuvwxyzabcdefghijklm
Він сильніший за шифр Атбаш, бо має 27 можливих ключів і 25 придатних до використання ключів.
Шифротекст записують у тому самому форматі, що й вхідні дані, разом із пробілами та розділовими знаками.
omg дає trl
c дає c
Cool дає Cool
The quick brown fox jumps over the lazy dog. дає Gur dhvpx oebja sbk whzcf bire gur ynml qbt.
Gur dhvpx oebja sbk whzcf bire gur ynml qbt. дає The quick brown fox jumps over the lazy dog.
Потрібно реалізувати функцію rotate, яка приймає Int і String, а потім кодує його за допомогою ротаційного шифру.
Можна скористатися наданою сигнатурою, якщо є сумніви щодо типів, але не варто дозволяти їй обмежувати творчість.
Ця вправа працює з текстовими даними. З історичних причин тип String у Haskell
є синонімом до [Char], списку символів. Для ефективнішої роботи з текстовими
даними можна використовувати тип Text.
Як необовʼязкове розширення до цієї вправи можна:
- text до списку залежностей у package.yaml.Data.Text у такий
спосіб:import qualified Data.Text as T
import Data.Text (Text)
Text, наприклад rotate :: Int -> Text -> Text, і звертатися
до комбінаторів Data.Text як, наприклад, T.pack.Data.Text.String на Text у RotationalCipher.hs, тобто:rotate :: Int -> Text -> Text
Ця частина цілком необовʼязкова.