Add remaining haskell book exercises
This commit is contained in:
16
Haskell-book/13/Cipher.hs
Normal file
16
Haskell-book/13/Cipher.hs
Normal file
@@ -0,0 +1,16 @@
|
||||
module Cipher where
|
||||
|
||||
import Data.Char
|
||||
import Data.List
|
||||
|
||||
vigenere :: String -> String
|
||||
vigenere = f (cycle [0, 11, 11, 24])
|
||||
where f _ [] = []
|
||||
f ys (' ':xs) = ' ' : (f ys xs)
|
||||
f (y:ys) (x:xs) = (decode (x, y)) : (f ys xs)
|
||||
where decode (x, y) = chr ((mod ((ord x) - 65 + y) 26) + 65)
|
||||
|
||||
main :: IO ()
|
||||
main = do
|
||||
i <- getLine
|
||||
putStrLn $ vigenere i
|
||||
20
Haskell-book/13/Palindrome.hs
Normal file
20
Haskell-book/13/Palindrome.hs
Normal file
@@ -0,0 +1,20 @@
|
||||
module Palindrome where
|
||||
|
||||
import Control.Monad
|
||||
import Data.Char
|
||||
import System.Exit
|
||||
|
||||
format :: String -> String
|
||||
format s = filter (\x -> x >= 'a' && x <= 'z') (map toLower s)
|
||||
|
||||
palindrome :: IO ()
|
||||
palindrome = forever $ do
|
||||
line1 <- getLine
|
||||
case ((format line1) == (format $ reverse line1)) of
|
||||
True -> putStrLn "It's a palindrome!"
|
||||
False -> do
|
||||
putStrLn "Nope!"
|
||||
exitSuccess
|
||||
|
||||
main :: IO ()
|
||||
main = palindrome
|
||||
34
Haskell-book/13/Person.hs
Normal file
34
Haskell-book/13/Person.hs
Normal file
@@ -0,0 +1,34 @@
|
||||
module Person where
|
||||
|
||||
type Name = String
|
||||
type Age = Integer
|
||||
|
||||
data Person = Person Name Age deriving Show
|
||||
|
||||
data PersonInvalid = NameEmpty
|
||||
| AgeTooLow
|
||||
| PersonInvalidUnknown String
|
||||
deriving (Eq, Show)
|
||||
|
||||
mkPerson :: Name -> Age -> Either PersonInvalid Person
|
||||
mkPerson name age
|
||||
| name /= "" && age > 0 = Right $ Person name age
|
||||
| name == "" = Left NameEmpty
|
||||
| not (age > 0) = Left AgeTooLow
|
||||
| otherwise =
|
||||
Left $ PersonInvalidUnknown $
|
||||
"Name was: " ++ show name ++ " Age was: " ++ show age
|
||||
|
||||
showPerson :: Either PersonInvalid Person -> String
|
||||
showPerson (Left NameEmpty) = "Name is empty"
|
||||
showPerson (Left AgeTooLow) = "Age is too low"
|
||||
showPerson (Left (PersonInvalidUnknown e)) = e
|
||||
showPerson (Right p) = "Yay! Successfully got a person: " ++ (show p)
|
||||
|
||||
gimmePerson :: IO ()
|
||||
gimmePerson = do
|
||||
putStr "Enter your name: "
|
||||
name <- getLine
|
||||
putStr "Enter your age: "
|
||||
age <- getLine
|
||||
putStrLn $ showPerson $ mkPerson name (read age)
|
||||
Reference in New Issue
Block a user