3

file:the-99-problems/haskell.org

 1 year ago
source link: https://blog.oyanglul.us/the-99-problems/haskell.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

1. Find the last element

last [1, 2, 3, 4]
4

2. Find the but last element

last . init $ [1,2,3,4]
3

3. find kth element

[1,2,3,4,5] !! 2
3

4. length

length [1,2,3,4,5]
5

5. reverse list

reverse [1,2,3,4,5]
5 4 3 2 1

6. palindrome

let isPalindrome a = reverse a == a
isPalindrome [1,2,3,2,1]
True

7. flatten list

:set +m
data NestedList a = Elem a | List [NestedList a]

let flatten (List []) = []
    flatten (Elem a) = [a]
    flatten (List (x:xs)) = flatten x ++ flatten (List xs)

flatten (List [Elem 1, List [Elem 2, List [Elem 3, Elem 4], Elem 5]])
Prelude> [1,2,3,4,5]

8. compress

import Data.List
map head $ group "aaaabccaadeeee"
abcade

9. pack

group ['a', 'a', 'a', 'a', 'b', 'c', 'c', 'a', 'a', 'd', 'e', 'e', 'e', 'e']
Prelude Data.List| ["aaaa","b","cc","aa","d","eeee"]

10. encode

map (\n -> (head n, length n)) $ group "aaaabccaadeeee"
a 4
b 1
c 2
a 2
d 1
e 4

11. Modified run-length encoding.

:set +m
import Data.List
data Modified a b = Single b | Multiple a b deriving Show
let encode = map (\n -> (head n, length n)) . group 
let encodeModified = map modify . encode where
      modify (b, 1) = Single b
      modify (c, d) = Multiple d c

encodeModified "aaaabccaadeeee"
Prelude Data.List> Prelude Data.List> Prelude Data.List> Prelude Data.List| Prelude Data.List| Prelude Data.List| Prelude Data.List> [Multiple 4 'a',Single 'b',Multiple 2 'c',Multiple 2 'a',Single 'd',Multiple 4 'e']

12. Decode a run-length encoded list.

let decodeModified [] = []
    decodeModified (x:xs) = decode x ++ decodeModified xs where
      decode (Multiple a b) = replicate a b  
      decode (Single a) = [a]

decodeModified [Multiple 4 'a',Single 'b',Multiple 2 'c', Multiple 2 'a',Single 'd',Multiple 4 'e']
Prelude Data.List> "aaaabccaadeeee"

13. Run-length encoding of a list

encodeModified "aaaabccaadeeee"
Multiple 4 a Single b Multiple 2 c Multiple 2 a Single d Multiple 4 e

14. Duplicate the elements of a list.

let dupli = concatMap (replicate 2)

dupli [1,2,3,4]
Prelude Data.List| Prelude Data.List> [1,1,2,2,3,3,4,4]

15. Replicate the elements of a list a given number of times.

let dupli a b = concatMap (replicate b) a

dupli [1,2,3,4] 3
Prelude Data.List| Prelude Data.List> [1,1,1,2,2,2,3,3,3,4,4,4]

16. Drop every N'th element from a list.

let dropEvery a n = map fst $ filter (\(d, i) -> i `mod` n /= 0) $ zip a [1..]

dropEvery "abcdefghik" 3
Prelude Data.List| Prelude Data.List> "abdeghk"

17. Split a list into two parts; the length of the first part is given

splitAt 3 "abcdefghik"
abc defghik

18. Extract a slice from a list.

let slice c a b = take (b-a+1) $ drop (a-1) c

slice ['a','b','c','d','e','f','g','h','i','k'] 3 7
Prelude Data.List| Prelude Data.List> "cdefg"

19. Rotate a list N places to the left.

let rotate a n = drop (c n) a ++ take (c n) a where
      c d = ((length a) + d) `mod` (length a)

rotate ['a','b','c','d','e','f','g','h'] 3
rotate ['a','b','c','d','e','f','g','h'] (-2)
ghabcdef

20. Remove the K'th element from a list.

let removeAt n a = (a !! (n-1), take (n-1) a ++ drop (n) a)

removeAt 3 "abcd"
c abd

21. Insert an element at a given position into a list.

let insertAt x a n = fst b ++ [x] ++ snd b where
      b = splitAt (n-1) a

insertAt 'X' "abcd" 2
Prelude| Prelude| Prelude> "aXbcd"

22. Create a list containing all integers within a given range

range a b= [a..b]
range 4 9
4 5 6 7 8 9

23. Extract a given number of randomly selected elements from a list

import System.Random
let rnd_select xs n = do
    gen <- getStdGen
    return $ take n [ xs !! x | x <- randomRs (0, (length xs) - 1) gen]

rnd_select "abcdefgh" 3
Prelude System.Random| Prelude System.Random| Prelude System.Random| Prelude System.Random> dbc

24. Draw N different random numbers from the set 1..M

let diffSelect xs n = do
    gen <- getStdGen
    return $ (take n . nub) [ xs !! x | x <- randomRs (0, (length xs) - 1) gen]


diffSelect 6 43
Prelude System.Random> [41,13,4,36,3,33]

25. Generate a random permutation of the elements of a list.

import Data.List
let permu xs = do
    gen <- getStdGen
    return $ take 10 [ xs !! x | x <- randomRs (0, (length xs) - 1) gen]

permu "asdfasdf"
Prelude System.Random Data.List| Prelude System.Random Data.List| Prelude System.Random Data.List| 
<interactive>:172:1: error:
    parse error (possibly incorrect indentation or mismatched brackets)
import Data.List
permutations "asd"
asd sad dsa sda das ads

26. Generate the combinations of K distinct objects chosen from the N elements of a list

let combinations _ [] = []
    combinations 0 _ = [[]]
    combinations n (x:xs) = map (x:) (combinations (n-1) xs) ++ combinations n xs

combinations 3 "abcdef"
Prelude| Prelude| Prelude| Prelude> ["abc","abd","abe","acd","ace","ade","bcd","bce","bde","cde"]
filter (\x -> ((length x)==3)) $ subsequences "abcdef"
abc abd acd bcd abe ace bce ade bde cde abf acf bcf adf bdf cdf aef bef cef def

TODO 27. Group the elements of a set into disjoint subsets.

combinations n = filter (\x -> ((length x)==n)) $ subsequences
group ns xs = map ($ xs) $ map combinations ns

group [2,3,4] ["aldo","beat","carla","david","evi","flip","gary","hugo","ida"]

28. Sorting a list of lists according to length of sublists

sortOn length ["abc","de","fgh","de","ijkl","mn","o"]
o de de mn abc fgh ijkl

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK