Пользовательские функции ord и chr - PullRequest
2 голосов
/ 30 марта 2012

Мне нужно написать "пользовательские" функции ord и chr.Я пишу небольшую программу для применения шифра Цезаря к сообщению.Какой самый быстрый способ сделать это?

Функция "ord" должна только взять символ и затем вернуть соответствующее число.«A» должен вернуть 0, «B» должен вернуть 1 и т. Д. Предположим, что мы будем использовать только заглавные буквы, поэтому у нас есть только 26 возможностей.Я бы предпочел не выписывать 26 охранников.Есть лучший способ сделать это?Вот как они будут использоваться.Функция "chr" должна делать обратное.

caesarencipher::Int->Int->String->String
caesarencipher r s p = map chr . map encipher $ plaintext
    where
        plaintext = map ord p
        encipher p =  mod (r*p + s) 26

caesardecipher::Int->Int->String->String
caesardecipher r s c = map chr . map decipher $ ciphertext
    where
        ciphertext = map ord c
        inverser x | mod (r * x) 26 == 1 = x
                   | otherwise = inverser (x + 1)
        decipher c = mod ((inverser 1) * (c - s)) 26

Ответы [ 2 ]

2 голосов
/ 30 марта 2012

Если вы действительно хотите самый быстрый способ определения пользовательских версий этих функций, просто напишите все возможные шаблоны.Вы можете упаковать несколько предложений в строку, разделив их точкой с запятой.

Однако я не вижу, что вы получите.ord и chr не медленнее только потому, что они обрабатывают все кодовые точки;Char уже хранит полную кодовую точку Unicode.Действительно, ord должен быть в основном бесплатным, а также chr (помимо простой проверки на валидность).Так почему бы просто не применить соответствующее числовое смещение к стандартным функциям ord и chr?(Обратите внимание, что даже простое написание шаблонов, как я предлагал выше, не пропустит проверку ошибок полностью; GHC сгенерирует исключение, если передано значение, которое не обрабатывается ни одним из ваших предложений.)

1 голос
/ 30 марта 2012
isAZ x = x >= 'A' && x <= 'Z'

ordAZ c | isAZ c = x where x = ord x   - ord 'A'
chrAZ x | isAZ c = c where c = chr $ x + ord 'A'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...