25 lines
633 B
Haskell
25 lines
633 B
Haskell
import Data.Bool (bool)
|
|
import Data.Char (chr, isAlpha, isUpper, ord)
|
|
|
|
---------------------- CAESAR CIPHER ---------------------
|
|
|
|
caesar, uncaesar :: Int -> String -> String
|
|
caesar = fmap . tr
|
|
uncaesar = caesar . negate
|
|
|
|
tr :: Int -> Char -> Char
|
|
tr offset c
|
|
| isAlpha c =
|
|
chr
|
|
. ((+) <*> (flip mod 26 . (-) (offset + ord c)))
|
|
$ bool 97 65 (isUpper c)
|
|
| otherwise = c
|
|
|
|
--------------------------- TEST -------------------------
|
|
main :: IO ()
|
|
main = do
|
|
let k = -114
|
|
cipher = caesar k
|
|
plain = "Curio, Cesare venne, e vide e vinse ? "
|
|
mapM_ putStrLn $ [cipher, uncaesar k . cipher] <*> [plain]
|