RosettaCodeData/Task/Caesar-cipher/Haskell/caesar-cipher-2.hs

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]