自定义ord和chr功能

时间:2012-03-30 02:35:36

标签: haskell encryption cryptography

我需要编写“自定义”ord和chr函数。我正在编写一个程序来将Caesar密码应用于消息。最快的方法是什么?

函数“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 个答案:

答案 0 :(得分:2)

如果您真的想要以最快的方式定义这些函数的自定义版本,那么只需写出每个可能的模式。您可以使用分号将多个子句打包到一行上。

但是,我不知道你会得到什么。 ordchr并非较慢因为它们处理所有代码点; Char已存储完整的Unicode代码点。实际上,ord基本上应该是免费的,而chr也应该是免费的(超出简单的有效性检查)。那么为什么不将相应的数字偏移应用于标准ordchr函数呢? (请注意,即使只是按照我上面的建议写出模式也不会完全忽略错误检查;如果传递的值没有任何子句处理,GHC将抛出异常。)

答案 1 :(得分:1)

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'