Обо мне

Моя фотография
Дикий Полярный Сов

пятница, 16 апреля 2010 г.

Erlang - шифр цезаря.

Рад вам представить результат двух вечеров мучений - *барабанная дробь* - шифр Цезаря (а точнее, аффинные преобразования его же имени) на эрланге.

О том, что из этого получилось - под катом.




Итак, изначально идея проста - есть функция, которая кодирует некий символ из алфавита путем арифметических действий (умножение и сложение) над его порядковым номером в этом алфавите. Получившееся число делится по модулю на длину алфавита - и получаем порядковый номер нового символа.
При реализации упор я сделал на то, что каждый символ кодируется _одним_ целым числом. В процессе кодирования выяснилось, что одно число - это unicode codepoint, а на самом деле символ кириллицы представляется в виде двух двоичных чисел (латиница и цифры - по-прежнему одним).

Итак, реализация и элегантные костылики:


Модуль unic - переводит список вида [208,179....] (именно список, а не бинарную последовательность) в список codepoint'ов:

UPD: хтмл-парсер съел немного, выкладываю с пастебина

Кодирование

В консоли стартуем сервер: caesar:init(), после чего кодируем сообщения: caesar:enc("Сообщение").

Вот такие велосипеды.

3 комментария:

  1. Меня смутила вот эта фраза
    > на самом деле символ представляется в виде двух двоичных чисел.
    цифры и латиница представляются одним числом, а иероглифы могут потребовать 3 и больше чисел.

    ОтветитьУдалить
  2. Так, перепишу )

    unic.erl работает так: если одно число - валидный unicode-символ (то бишь цифра или латиница) - оно так и остается одним (как раз паттерн Char), а если не валидно ({incomplete,_,_}), тогда берется следующее и клеится.

    В принципе, можно еще сильнее обобщить и сделать два аккумулятора в рекурсии - и тогда три и более чисел тоже будут нормально распознаваться.

    ОтветитьУдалить
  3. ну аффинский шрифт можно и купить за недорого))
    http://www.goldcoding.net/DoneProggrams/PreviewProgram/8

    ОтветитьУдалить