Развлекался на паре по криптографии освоением Haskell. Граждане, имеющие к нему отношение, гляньте, пожалуйста - может я чушь написал? Насколько грамотен такой подход?
Задачка простенькая - шифр Цезаря. С условиями, чтоб буквы кодировались с учетом регистра, а все, что не буквы - оставалось прежним.
import Char
-- Получить ascii-код начала алфавита для строчных и прописных букв
getDiff x =
if isLower x
then ord 'a'
else if isUpper x
then ord 'A'
else
0
-- разбить ascii код на пару чисел: номер в алфавите и ascii-смещение алфавита
splitAscii x =
(ord x - getDiff x, getDiff x)
-- сформировать ascii-символ из пары чисел
formAscii pair =
chr (fst pair + snd pair)
-- циклический сдвиг на n позиций
cycle_shift n pair =
let
abc_length = ord 'z' - ord 'a' + 1
in
if snd pair == 0
then pair
else
(mod (fst pair+n) abc_length, snd pair)
-- Процедура шифрации/дешифрации
caesar n msg =
map formAscii $ map (cycle_shift n) $ map splitAscii msg
-- врапперы к caesar, они же точки входа
encode n msg =
caesar n msg
decode n msg =
caesar (-n) msg