Learn You a Haskell presents the Caesar Cipher:
The Caesar cipher is a primitive method of encoding messages by shifting each character in them by a fixed number of positions in the alphabet
EDIT
Since I'm not limiting this cipher to letters, it's not actually the Caesarian Cipher. Thanks to Anonymous. This implementation is only a Substitution Cipher.
Here's my implementation:
import Data.Char (ord, chr)
encode :: Int -> String -> String
encode n = map $ shift' n
where shift' x = chr . (+ x) . ord
decode :: Int -> String -> String
decode n = map $ shift' n
where shift' x = chr . abs . ((-) x) . ord
Test:
*Main Data.Char> encode 1 "AAA"
"BBB"
*Main Data.Char>
*Main Data.Char> decode 1 "BBB"
"AAA"
I don't like that I'm using abs
in my decode
. How can I write a function (through currying) that will subtract X from it?
Also, please critique my implementation.
isAsciiUpper
,isAsciiLower
andmod
. \$\endgroup\$