99-haskell-problems

commit c0a7e37a7070086d18744b5dd75843bac914a658

tree

parent:
99cbaa37b7ae18ff97b86fb15e60808434311257

Nick Mykins <nickmykins@transfix.io>

2018-02-01T17:17:39-05:00

progress

diff --git a/99_problems.hs b/99_problems.hs
index 9e432bb122dcfa5141e7c4b9166d6146c581d7fc..f664dce108cc1548b237935d1357b6244dc7c297 100644
--- a/99_problems.hs
+++ b/99_problems.hs
@@ -88,5 +88,50 @@
 
 -- 10. Encode runs of identical elements into tuples: 
 --     (<number of elements in run>, <element>)
-encode :: Eq a => [a]-> [(Int, a)]
+encode :: Eq a => [a] -> [(Int, a)]
 encode = map (\l -> (length l, head l)) . pack
+
+
+-- 11. Encode runs of identical elements into custom data type
+data OneOrMany a = Multiple Int a | Single a deriving Show
+
+encodeModified :: Eq a => [a] -> [OneOrMany a]
+encodeModified = map (\l -> if length l == 1
+                            then Single $ head l
+                            else Multiple (length l) (head l)) . pack
+
+
+-- 12. Decode a run-length encoded list
+decodeModified :: Eq a => [OneOrMany a] -> [a]
+decodeModified [] = []
+decodeModified [Single x] = [x]
+decodeModified [Multiple n x] = take n $ repeat x
+decodeModified (x:xs) = (decodeModified [x]) ++ (decodeModified xs)
+
+
+-- 13. Directly run-length encode a list without creating sublists
+encodeDirect :: Eq a => [a] -> [OneOrMany a]
+encodeDirect [] = []
+encodeDirect (x:xs) = 
+    let run = span (== x) xs
+        pkg = \l -> if length l == 1 
+                    then Single $ head l 
+                    else Multiple (length l) (head l)
+    in pkg (x : fst run) : (encodeDirect $ snd run)
+
+
+-- 14. Duplicate the elements of a list; e.g. "abc" -> "aabbcc"
+dupli :: [a] -> [a]
+dupli [] = []
+dupli (x:xs) = x:x:(dupli xs)
+
+
+-- 15. As above, but replicate the elements of a list a given number of times
+repli :: [a] -> Int -> [a]
+repli [] _ = []
+repli l n = concat [take n $ repeat x | x <- l]
+
+
+-- 16. Drop every n'th element from a list
+dropEvery :: [a] -> Int -> [a]
+dropEvery list n = map fst [x | x <- zip list [1..], snd x `mod` n /= 0]