18 lines
418 B
Haskell
18 lines
418 B
Haskell
import Data.Char (ord, chr)
|
|
import Data.Ix (inRange)
|
|
|
|
caesar :: Int -> String -> String
|
|
caesar k = map f
|
|
where
|
|
f c
|
|
| inRange ('a','z') c = tr 'a' k c
|
|
| inRange ('A','Z') c = tr 'A' k c
|
|
| otherwise = c
|
|
|
|
unCaesar :: Int -> String -> String
|
|
unCaesar k = caesar (-k)
|
|
|
|
-- char addition
|
|
tr :: Char -> Int -> Char -> Char
|
|
tr base offset char = chr $ ord base + (ord char - ord base + offset) `mod` 26
|