Рад вам представить результат двух вечеров мучений - *барабанная дробь* - шифр Цезаря (а точнее, аффинные преобразования его же имени) на эрланге.
О том, что из этого получилось - под катом.
Итак, изначально идея проста - есть функция, которая кодирует некий символ из алфавита путем арифметических действий (умножение и сложение) над его порядковым номером в этом алфавите. Получившееся число делится по модулю на длину алфавита - и получаем порядковый номер нового символа.
При реализации упор я сделал на то, что каждый символ кодируется _одним_ целым числом. В процессе кодирования выяснилось, что одно число - это unicode codepoint, а на самом деле символ кириллицы представляется в виде двух двоичных чисел (латиница и цифры - по-прежнему одним).
Итак, реализация и элегантные костылики:
Модуль unic - переводит список вида [208,179....] (именно список, а не бинарную последовательность) в список codepoint'ов:
UPD: хтмл-парсер съел немного, выкладываю с пастебина
Кодирование
В консоли стартуем сервер: caesar:init(), после чего кодируем сообщения: caesar:enc("Сообщение").
Вот такие велосипеды.
Меня смутила вот эта фраза
ОтветитьУдалить> на самом деле символ представляется в виде двух двоичных чисел.
цифры и латиница представляются одним числом, а иероглифы могут потребовать 3 и больше чисел.
Так, перепишу )
ОтветитьУдалитьunic.erl работает так: если одно число - валидный unicode-символ (то бишь цифра или латиница) - оно так и остается одним (как раз паттерн Char), а если не валидно ({incomplete,_,_}), тогда берется следующее и клеится.
В принципе, можно еще сильнее обобщить и сделать два аккумулятора в рекурсии - и тогда три и более чисел тоже будут нормально распознаваться.
ну аффинский шрифт можно и купить за недорого))
ОтветитьУдалитьhttp://www.goldcoding.net/DoneProggrams/PreviewProgram/8