Advertisement
csaki

Huffman - clean 1. beadandó

Oct 16th, 2016
168
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. module Huffman
  2.  
  3. import StdEnv, StdLib
  4.  
  5. :: Bit = Zero | One
  6.  
  7. :: Code :== [Bit]
  8.  
  9. :: Frequency :== (Char, Int)
  10.  
  11. :: Frequencies :== ([Frequency], Int)
  12.  
  13. :: CodeTree = Node Int CodeTree CodeTree
  14.             | Leaf Char
  15.  
  16. instance == Bit where
  17.   (==) Zero Zero = True
  18.   (==) One One = True
  19.   (==) _ _ = False
  20.  
  21. instance == CodeTree where
  22.   (==) (Leaf a) (Leaf b) = a == b
  23.   (==) (Node x aLeft aRight) (Node y bLeft bRight) = x == y && aLeft == bLeft && aRight == bRight
  24.   (==) _ _ = False
  25.  
  26. // Done
  27. getFrequencies :: String -> [Frequency]
  28. getFrequencies str = getFrequencies2 [] [ch \\ ch <-: str]
  29.  
  30. getFrequencies2 :: [Char] [Char] -> [Frequency]
  31. getFrequencies2 _ [] = []
  32. getFrequencies2 list [x:xs]
  33.     | isMember x list = getFrequencies2 list xs
  34.     | otherwise = [(x, (length (filter ((==) x) [x:xs]))) : getFrequencies2 [x : list] xs]
  35.  
  36. // Done
  37. frequencyToFrequencies :: [Frequency] -> [Frequencies]
  38. frequencyToFrequencies frs = map expandTuple frs
  39.     where
  40.         expandTuple :: Frequency -> Frequencies
  41.         expandTuple t = ([t], snd t)
  42.  
  43. // Done
  44. sortFrequencies :: [Frequencies] -> [Frequencies]
  45. sortFrequencies list = sortBy (\t1 t2 = (snd t1) < (snd t2)) list
  46.  
  47. sortTupleList :: [(a, Int)] -> [(a, Int)]
  48. sortTupleList list = sortBy (\t1 t2 = (snd t1) < (snd t2)) list
  49.  
  50. buildTree :: [Frequencies] -> CodeTree
  51. buildTree list = leavesToTree (sortTupleList (frequenciesToCodeTrees list))
  52.  
  53. frequenciesToCodeTrees :: [Frequencies] -> [(CodeTree, Int)]
  54. frequenciesToCodeTrees list = map freqToLeaf list
  55.     where
  56.         freqToLeaf :: Frequencies -> (CodeTree, Int)
  57.         freqToLeaf ([frequency:_],number) = (Leaf (fst frequency), number)
  58.  
  59. leavesToTree :: [(CodeTree, Int)] -> CodeTree
  60. leavesToTree [(node, number):[]]    = node
  61. leavesToTree [(node1, number1),(node2, number2):remaining]
  62.     = leavesToTree (sortTupleList [(Node sum node1 node2, sum):remaining])
  63.     where
  64.         sum = number1 + number2
  65.  
  66. //Start = buildTree (frequencyToFrequencies (getFrequencies "abrakadabra"))
  67. //Ez lesz: Node 11 (Leaf 'a') (Node 6 (Node 4 (Leaf 'r') (Leaf 'b')) (Node 2 (Leaf 'k') (Leaf 'd')))
  68. //Ez kéne: Node 11 (Leaf 'a') (Node 6 (Leaf 'r') (Node 4 (Node 2 (Leaf 'k') (Leaf 'd')) (Leaf 'b')))
  69.  
  70.  
  71. abrakadabra = Node 11 (Leaf 'a') (Node 6 (Node 4 (Leaf 'r') (Leaf 'b')) (Node 2 (Leaf 'k') (Leaf 'd')))
  72. //Start = lookupCode abrakadabra 'a' == [Zero]
  73. //Start = lookupCode abrakadabra 'b' == [One,Zero,One]
  74. //Start = lookupCode abrakadabra 'd' == [One,One,One]
  75. //Start = lookupCode (Leaf 'a') 'a'  == [Zero]
  76.  
  77. lookupCode :: CodeTree Char -> Code
  78. lookupCode (Leaf a) char = if (a == char) [Zero] []
  79. lookupCode (Node n (Leaf a) (Leaf b)) char = if (a == char) [Zero] (if (b == char) [One] [])
  80. lookupCode (Node n (Leaf a) (Node n1 codeTree1 codeTree2)) char = if (a == char) [Zero] ((lookupCode codeTree1 char) ++ (lookupCode codeTree2 char))
  81. lookupCode (Node n (Node n1 codeTree1 codeTree2) (Leaf a)) char = if (a == char) [One] ((lookupCode codeTree1 char) ++ (lookupCode codeTree2 char))
  82. lookupCode (Node n codeTree1 codeTree2) char = (lookupCode codeTree1 char) ++ (lookupCode codeTree2 char)
  83.  
  84. lookupPrefix :: CodeTree Code -> Char
  85. lookupPrefix _ _ = 'a'
  86.  
  87. encode :: String -> (CodeTree, Code)
  88. encode str = (Leaf 'a', [])
  89.  
  90. decode :: (CodeTree, Code) -> String
  91. decode (tree, c) = ""
  92.  
  93. /*
  94. Start = (and (flatten allTests), allTests)
  95.   where
  96.     allTests =
  97.       [ test_getFrequencies
  98.       , test_frequencyToFrequencies
  99.       , test_sortFrequencies
  100.       , test_buildTree
  101.       , test_lookupCode
  102.       , test_lookupPrefix
  103.       , test_encode
  104.       , test_decode
  105.       ]
  106. */
  107.  
  108. test_getFrequencies =
  109.   [ isEmpty (getFrequencies "")
  110.   , and (map (\x -> isMember x (getFrequencies "abrakadabra")) [('r',2),('k',1),('d',1),('b',2),('a',5)])
  111.   , and (map (\x -> isMember x (getFrequencies "Szeretem a clean-t")) [('z',1),('t',2),('r',1),('n',1),('m',1),('l',1),('e',4),('c',1),('a',2),('S',1),('-',1),(' ',2)])
  112.   , and (map (\x -> isMember x (getFrequencies "adadada")) (getFrequencies "dadadaa"))
  113.   ]
  114.  
  115. test_frequencyToFrequencies =
  116.   [
  117.     frequencyToFrequencies [('r',2),('k',1),('d',1),('b',2),('a',5)] == [([('r',2)],2),([('k',1)],1),([('d',1)],1),([('b',2)],2),([('a',5)],5)]
  118.   ]
  119.  
  120. test_sortFrequencies =
  121.   [ sort (map snd (sortFrequencies [([('r',2)],2),([('d',1)],1),([('k',1)],1),([('b',2)],2),([('a',5)],5)])) == [1,1,2,2,5]
  122.   ]
  123.  
  124. test_buildTree =
  125.   [ buildTree [([('a',1)],1)] == Leaf 'a'
  126.   , buildTree [([('a',1)],1), ([('b',2)],2)] == Node 3 (Leaf 'a') (Leaf 'b') || buildTree [([('a',1)],1), ([('b',2)],2)] == Node 3 (Leaf 'b') (Leaf 'a')
  127.   , countNodes (buildTree (frequencyToFrequencies (getFrequencies "sokf�le karakterb�l �ll� sz�veg"))) == 37
  128.   ]
  129.     where
  130.       countNodes (Leaf _) = 1
  131.       countNodes (Node _ left right) = 1 + (countNodes left) + (countNodes right)
  132.  
  133. test_lookupCode =
  134.   [ lookupCode abrakadabra 'a' == [Zero]
  135.   , lookupCode abrakadabra 'b' == [One,Zero,One]
  136.   , lookupCode abrakadabra 'd' == [One,One,One]
  137.   , lookupCode (Leaf 'a') 'a'  == [Zero]
  138.   ]
  139.   where
  140.     abrakadabra = Node 11 (Leaf 'a') (Node 6 (Node 4 (Leaf 'r') (Leaf 'b')) (Node 2 (Leaf 'k') (Leaf 'd')))
  141.  
  142. test_lookupPrefix =
  143.   [ lookupPrefix abrakadabra (lookupCode abrakadabra 'a') == 'a'
  144.   , lookupPrefix abrakadabra (lookupCode abrakadabra 'b') == 'b'
  145.   , lookupPrefix abrakadabra (lookupCode abrakadabra 'd') == 'd'
  146.   , lookupPrefix abrakadabra (lookupCode (Leaf 'a') 'a')  == 'a'
  147.   ]
  148.   where
  149.     abrakadabra = Node 11 (Leaf 'a') (Node 6 (Node 4 (Leaf 'r') (Leaf 'b')) (Node 2 (Leaf 'k') (Leaf 'd')))
  150.  
  151. test_encode =
  152.   [ (length o snd) (encode "abrakadabra") == 23
  153.   , encode "aaaaa" == (Leaf 'a', [Zero,Zero,Zero,Zero,Zero])
  154.   ]
  155.  
  156. test_decode =
  157.   [ decode (encode "Decode function test") == "Decode function test"
  158.   ,  decode (encode "Functional programming is fun!") == "Functional programming is fun!"
  159.   ,  decode (abrakadabra, [Zero,One,Zero,One,One,Zero,Zero,Zero,One,One,Zero]) == "abrak"
  160.   ]
  161.   where
  162.     abrakadabra = Node 11 (Leaf 'a') (Node 6 (Node 4 (Leaf 'r') (Leaf 'b')) (Node 2 (Leaf 'k') (Leaf 'd')))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement