new: Solved problems 46 to 50
This commit is contained in:
parent
9b279bc5d0
commit
52b3adeb6f
5 changed files with 151 additions and 0 deletions
25
Problems 46-50/problem_46.hs
Normal file
25
Problems 46-50/problem_46.hs
Normal file
|
@ -0,0 +1,25 @@
|
|||
-- There isn't much point in implementing the basic predicates by hand
|
||||
-- as it'd be equivalent to just writing their truth tables
|
||||
and' :: Bool -> Bool -> Bool
|
||||
and' = (&&)
|
||||
|
||||
or' :: Bool -> Bool -> Bool
|
||||
or' = (||)
|
||||
|
||||
nand' :: Bool -> Bool -> Bool
|
||||
nand' x y = not $ and' x y
|
||||
|
||||
nor' :: Bool -> Bool -> Bool
|
||||
nor' x y = not $ or' x y
|
||||
|
||||
xor' :: Bool -> Bool -> Bool
|
||||
xor' = (/=)
|
||||
|
||||
impl' :: Bool -> Bool -> Bool
|
||||
impl' x = or' (not x)
|
||||
|
||||
equ' :: Bool -> Bool -> Bool
|
||||
equ' = (==)
|
||||
|
||||
table :: (Bool -> Bool -> Bool) -> IO ()
|
||||
table f = mapM_ putStrLn [show x ++ " " ++ show y ++ " " ++ show (f x y) | x <- [True, False], y <- [True, False]]
|
39
Problems 46-50/problem_47.hs
Normal file
39
Problems 46-50/problem_47.hs
Normal file
|
@ -0,0 +1,39 @@
|
|||
-- There isn't much point in implementing the basic predicates by hand
|
||||
-- as it'd be equivalent to just writing their truth tables
|
||||
and' :: Bool -> Bool -> Bool
|
||||
and' = (&&)
|
||||
|
||||
infixl 4 `and'`
|
||||
|
||||
or' :: Bool -> Bool -> Bool
|
||||
or' = (||)
|
||||
|
||||
infixl 3 `or'`
|
||||
|
||||
nand' :: Bool -> Bool -> Bool
|
||||
nand' x y = not $ and' x y
|
||||
|
||||
infixl 9 `nand'`
|
||||
|
||||
nor' :: Bool -> Bool -> Bool
|
||||
nor' x y = not $ or' x y
|
||||
|
||||
infixl 9 `nor'`
|
||||
|
||||
xor' :: Bool -> Bool -> Bool
|
||||
xor' = (/=)
|
||||
|
||||
infixl 9 `xor'`
|
||||
|
||||
impl' :: Bool -> Bool -> Bool
|
||||
impl' x = or' (not x)
|
||||
|
||||
infixl 3 `impl'`
|
||||
|
||||
equ' :: Bool -> Bool -> Bool
|
||||
equ' = (==)
|
||||
|
||||
infixl 8 `equ'`
|
||||
|
||||
table :: (Bool -> Bool -> Bool) -> IO ()
|
||||
table f = mapM_ putStrLn [show x ++ " " ++ show y ++ " " ++ show (x `f` y) | x <- [True, False], y <- [True, False]]
|
45
Problems 46-50/problem_48.hs
Normal file
45
Problems 46-50/problem_48.hs
Normal file
|
@ -0,0 +1,45 @@
|
|||
import Control.Monad (replicateM)
|
||||
|
||||
-- There isn't much point in implementing the basic predicates by hand
|
||||
-- as it'd be equivalent to just writing their truth tables
|
||||
and' :: Bool -> Bool -> Bool
|
||||
and' = (&&)
|
||||
|
||||
infixl 4 `and'`
|
||||
|
||||
or' :: Bool -> Bool -> Bool
|
||||
or' = (||)
|
||||
|
||||
infixl 3 `or'`
|
||||
|
||||
nand' :: Bool -> Bool -> Bool
|
||||
nand' x y = not $ and' x y
|
||||
|
||||
infixl 9 `nand'`
|
||||
|
||||
nor' :: Bool -> Bool -> Bool
|
||||
nor' x y = not $ or' x y
|
||||
|
||||
infixl 9 `nor'`
|
||||
|
||||
xor' :: Bool -> Bool -> Bool
|
||||
xor' = (/=)
|
||||
|
||||
infixl 9 `xor'`
|
||||
|
||||
impl' :: Bool -> Bool -> Bool
|
||||
impl' x = or' (not x)
|
||||
|
||||
infixl 3 `impl'`
|
||||
|
||||
equ' :: Bool -> Bool -> Bool
|
||||
equ' = (==)
|
||||
|
||||
infixl 8 `equ'`
|
||||
|
||||
tablen :: Int -> ([Bool] -> Bool) -> IO ()
|
||||
tablen n f = mapM_ putStrLn [toStr x ++ show (f x) | x <- replicateM n [True, False]]
|
||||
where
|
||||
toStr = unwords . map ((++) <$> show <*> space)
|
||||
space True = " "
|
||||
space False = " "
|
13
Problems 46-50/problem_49.hs
Normal file
13
Problems 46-50/problem_49.hs
Normal file
|
@ -0,0 +1,13 @@
|
|||
gray :: Int -> [[Char]]
|
||||
gray n
|
||||
| n == 1 = ["0", "1"]
|
||||
| n > 1 =
|
||||
concatMap
|
||||
( \(i, l) ->
|
||||
if odd i
|
||||
then [(l ++)] <*> ["0", "1"]
|
||||
else [(l ++)] <*> ["1", "0"]
|
||||
)
|
||||
$ zip [1 ..]
|
||||
$ gray (n - 1)
|
||||
| otherwise = error "Not defined for n<1"
|
29
Problems 46-50/problem_50.hs
Normal file
29
Problems 46-50/problem_50.hs
Normal file
|
@ -0,0 +1,29 @@
|
|||
import Data.List (sortBy)
|
||||
|
||||
data HTree a = HBranch Int (HTree a) (HTree a) | HLeaf Int a
|
||||
|
||||
hTreeVal :: HTree a -> Int
|
||||
hTreeVal (HLeaf n _) = n
|
||||
hTreeVal (HBranch n _ _) = n
|
||||
|
||||
toHTree :: [HTree Char] -> HTree Char
|
||||
toHTree [t] = t
|
||||
toHTree [HLeaf f1 l1, HLeaf f2 l2] =
|
||||
if f1 < f2
|
||||
then HBranch (f1 + f2) (HLeaf f1 l1) (HLeaf f2 l2)
|
||||
else HBranch (f1 + f2) (HLeaf f2 l2) (HLeaf f1 l1)
|
||||
toHTree ls = toHTree (mod : tl)
|
||||
where
|
||||
(l1 : l2 : tl) = sortBy sorter ls
|
||||
sorter x y = hTreeVal x `compare` hTreeVal y
|
||||
mod = HBranch (hTreeVal l1 + hTreeVal l2) l1 l2
|
||||
|
||||
fromHTree :: HTree Char -> [(Char, String)]
|
||||
fromHTree (HLeaf 100 a) = [(a, "0")]
|
||||
fromHTree (HLeaf _ a) = [(a, "")]
|
||||
fromHTree (HBranch _ t1 t2) = [(c, '0' : s) | (c, s) <- fromHTree t1] ++ [(c, '1' : s) | (c, s) <- fromHTree t2]
|
||||
|
||||
huffman :: [(Char, Int)] -> [(Char, String)]
|
||||
huffman ls = map snd $ filter (\((c1, _), (c2, _)) -> c1 == c2) $ (,) <$> ls <*> sortedCodes
|
||||
where
|
||||
sortedCodes = fromHTree $ toHTree $ map (\(c, v) -> HLeaf v c) ls
|
Loading…
Reference in a new issue