2017-09-23 10:01:46 +02:00
|
|
|
import Data.Char (ord, chr, isUpper, isAlpha)
|
2019-09-12 10:33:56 -07:00
|
|
|
import Data.Bool (bool)
|
2016-12-05 22:15:40 +01:00
|
|
|
|
2017-09-23 10:01:46 +02:00
|
|
|
caesar, uncaesar :: Int -> String -> String
|
2019-09-12 10:33:56 -07:00
|
|
|
caesar = fmap . tr
|
2016-12-05 22:15:40 +01:00
|
|
|
|
2017-09-23 10:01:46 +02:00
|
|
|
uncaesar = caesar . negate
|
2016-12-05 22:15:40 +01:00
|
|
|
|
2017-09-23 10:01:46 +02:00
|
|
|
tr :: Int -> Char -> Char
|
|
|
|
|
tr offset c
|
2019-09-12 10:33:56 -07:00
|
|
|
| isAlpha c =
|
|
|
|
|
let i = ord $ bool 'a' 'A' (isUpper c)
|
|
|
|
|
in chr $ i + mod ((ord c - i) + offset) 26
|
2017-09-23 10:01:46 +02:00
|
|
|
| otherwise = c
|
2016-12-05 22:15:40 +01:00
|
|
|
|
2017-09-23 10:01:46 +02:00
|
|
|
main :: IO ()
|
|
|
|
|
main = mapM_ print [encoded, decoded]
|
|
|
|
|
where
|
|
|
|
|
encoded = caesar (-114) "Curio, Cesare venne, e vide e vinse ? "
|
|
|
|
|
decoded = uncaesar (-114) encoded
|