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

21 lines
493 B
Haskell
Raw Permalink Normal View History

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