99 questions/1 to 10
From HaskellWiki
m (Fixed definition of equivalent definition using concatMap for the Elem case) |
m (→Problem 7) |
||
| (43 intermediate revisions not shown.) | |||
| Line 1: | Line 1: | ||
__NOTOC__ | __NOTOC__ | ||
| - | + | This is part of [[H-99:_Ninety-Nine_Haskell_Problems|Ninety-Nine Haskell Problems]], based on [https://sites.google.com/site/prologsite/prolog-problems Ninety-Nine Prolog Problems] and [http://www.ic.unicamp.br/~meidanis/courses/mc336/2006s2/funcional/L-99_Ninety-Nine_Lisp_Problems.html Ninety-Nine Lisp Problems]. | |
| - | + | ||
| - | + | ||
== Problem 1 == | == Problem 1 == | ||
| - | (*) Find the last | + | (*) Find the last element of a list. |
| - | + | (Note that the Lisp transcription of this problem is incorrect.) | |
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
Example in Haskell: | Example in Haskell: | ||
<haskell> | <haskell> | ||
| - | Prelude> | + | Prelude> myLast [1,2,3,4] |
4 | 4 | ||
| - | Prelude> | + | Prelude> myLast ['x','y','z'] |
'z' | 'z' | ||
</haskell> | </haskell> | ||
| - | + | [[99 questions/Solutions/1 | Solutions]] | |
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
== Problem 2 == | == Problem 2 == | ||
| - | (*) Find the last but one | + | (*) Find the last but one element of a list. |
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | (Note that the Lisp transcription of this problem is incorrect.) | |
| + | |||
| + | Example in Haskell: | ||
<haskell> | <haskell> | ||
| - | myButLast | + | Prelude> myButLast [1,2,3,4] |
| - | + | 3 | |
| + | Prelude> myButLast ['a'..'z'] | ||
| + | 'y' | ||
</haskell> | </haskell> | ||
| + | |||
| + | [[99 questions/Solutions/2 | Solutions]] | ||
| + | |||
== Problem 3 == | == Problem 3 == | ||
| - | (*) Find the K'th element of a list. | + | (*) Find the K'th element of a list. The first element in the list is number 1. |
| - | The first element in the list is number 1. | + | |
| - | + | ||
Example: | Example: | ||
| + | |||
| + | <pre> | ||
* (element-at '(a b c d e) 3) | * (element-at '(a b c d e) 3) | ||
| - | + | c | |
</pre> | </pre> | ||
| - | + | Example in Haskell: | |
<haskell> | <haskell> | ||
| - | + | Prelude> elementAt [1,2,3] 2 | |
| - | + | 2 | |
| - | + | Prelude> elementAt "haskell" 5 | |
| + | 'e' | ||
</haskell> | </haskell> | ||
| - | + | [[99 questions/Solutions/3 | Solutions]] | |
| - | |||
| - | |||
| - | |||
| - | |||
== Problem 4 == | == Problem 4 == | ||
| Line 80: | Line 66: | ||
(*) Find the number of elements of a list. | (*) Find the number of elements of a list. | ||
| - | + | Example in Haskell: | |
<haskell> | <haskell> | ||
| - | + | Prelude> myLength [123, 456, 789] | |
| - | + | 3 | |
| - | + | Prelude> myLength "Hello, world!" | |
| + | 13 | ||
</haskell> | </haskell> | ||
| + | |||
| + | [[99 questions/Solutions/4 | Solutions]] | ||
| + | |||
== Problem 5 == | == Problem 5 == | ||
| Line 92: | Line 82: | ||
(*) Reverse a list. | (*) Reverse a list. | ||
| - | + | Example in Haskell: | |
<haskell> | <haskell> | ||
| - | reverse | + | Prelude> reverse "A man, a plan, a canal, panama!" |
| - | + | "!amanap ,lanac a ,nalp a ,nam A" | |
| + | Prelude> reverse [1,2,3,4] | ||
| + | [4,3,2,1] | ||
</haskell> | </haskell> | ||
| - | + | [[99 questions/Solutions/5 | Solutions]] | |
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
== Problem 6 == | == Problem 6 == | ||
| Line 111: | Line 98: | ||
(*) Find out whether a list is a palindrome. A palindrome can be read forward or backward; e.g. (x a m a x). | (*) Find out whether a list is a palindrome. A palindrome can be read forward or backward; e.g. (x a m a x). | ||
| - | + | Example in Haskell: | |
<haskell> | <haskell> | ||
| - | + | *Main> isPalindrome [1,2,3] | |
| - | isPalindrome | + | False |
| + | *Main> isPalindrome "madamimadam" | ||
| + | True | ||
| + | *Main> isPalindrome [1,2,4,8,16,8,4,2,1] | ||
| + | True | ||
</haskell> | </haskell> | ||
| + | |||
| + | [[99 questions/Solutions/6 | Solutions]] | ||
| + | |||
== Problem 7 == | == Problem 7 == | ||
| Line 123: | Line 117: | ||
Transform a list, possibly holding lists as elements into a `flat' list by replacing each list with its elements (recursively). | Transform a list, possibly holding lists as elements into a `flat' list by replacing each list with its elements (recursively). | ||
| + | |||
| + | Example: | ||
<pre> | <pre> | ||
| - | |||
* (my-flatten '(a (b (c d) e))) | * (my-flatten '(a (b (c d) e))) | ||
(A B C D E) | (A B C D E) | ||
</pre> | </pre> | ||
| - | + | Example in Haskell: | |
| - | + | ||
| - | + | ||
| + | We have to define a new data type, because lists in Haskell are homogeneous. | ||
<haskell> | <haskell> | ||
| - | data NestedList a = Elem a | List [NestedList a] | + | data NestedList a = Elem a | List [NestedList a] |
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
</haskell> | </haskell> | ||
| - | + | <haskell> | |
| - | + | ||
| - | + | ||
| - | < | + | |
*Main> flatten (Elem 5) | *Main> flatten (Elem 5) | ||
[5] | [5] | ||
| Line 153: | Line 139: | ||
*Main> flatten (List []) | *Main> flatten (List []) | ||
[] | [] | ||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
</haskell> | </haskell> | ||
| + | |||
| + | |||
| + | |||
| + | [[99 questions/Solutions/7 | Solutions]] | ||
== Problem 8 == | == Problem 8 == | ||
| Line 167: | Line 151: | ||
If a list contains repeated elements they should be replaced with a single copy of the element. The order of the elements should not be changed. | If a list contains repeated elements they should be replaced with a single copy of the element. The order of the elements should not be changed. | ||
| - | |||
Example: | Example: | ||
| + | |||
| + | <pre> | ||
* (compress '(a a a a b c c a a d e e e e)) | * (compress '(a a a a b c c a a d e e e e)) | ||
(A B C A D E) | (A B C A D E) | ||
| + | </pre> | ||
Example in Haskell: | Example in Haskell: | ||
| - | |||
| - | |||
| - | |||
| - | |||
<haskell> | <haskell> | ||
| - | + | > compress ["a","a","a","a","b","c","c","a","a","d","e","e","e","e"] | |
| - | + | ["a","b","c","a","d","e"] | |
</haskell> | </haskell> | ||
| - | + | [[99 questions/Solutions/8 | Solutions]] | |
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
== Problem 9 == | == Problem 9 == | ||
| Line 205: | Line 172: | ||
If a list contains repeated elements they should be placed in separate sublists. | If a list contains repeated elements they should be placed in separate sublists. | ||
| - | + | Example: | |
<pre> | <pre> | ||
| - | |||
* (pack '(a a a a b c c a a d e e e e)) | * (pack '(a a a a b c c a a d e e e e)) | ||
((A A A A) (B) (C C) (A A) (D) (E E E E)) | ((A A A A) (B) (C C) (A A) (D) (E E E E)) | ||
| - | < | + | </pre> |
Example in Haskell: | Example in Haskell: | ||
| - | |||
| - | |||
<haskell> | <haskell> | ||
| - | + | *Main> pack ['a', 'a', 'a', 'a', 'b', 'c', 'c', 'a', | |
| - | + | 'a', 'd', 'e', 'e', 'e', 'e'] | |
| - | + | ["aaaa","b","cc","aa","d","eeee"] | |
</haskell> | </haskell> | ||
| - | + | [[99 questions/Solutions/9 | Solutions]] | |
| - | + | ||
== Problem 10 == | == Problem 10 == | ||
| Line 232: | Line 196: | ||
Example: | Example: | ||
<pre> | <pre> | ||
| - | + | * (encode '(a a a a b c c a a d e e e e)) | |
| - | + | ((4 A) (1 B) (2 C) (2 A) (1 D)(4 E)) | |
</pre> | </pre> | ||
Example in Haskell: | Example in Haskell: | ||
| - | < | + | <haskell> |
encode "aaaabccaadeeee" | encode "aaaabccaadeeee" | ||
[(4,'a'),(1,'b'),(2,'c'),(2,'a'),(1,'d'),(4,'e')] | [(4,'a'),(1,'b'),(2,'c'),(2,'a'),(1,'d'),(4,'e')] | ||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
</haskell> | </haskell> | ||
| - | + | [[99 questions/Solutions/10 | Solutions]] | |
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
[[Category:Tutorials]] | [[Category:Tutorials]] | ||
Revision as of 16:10, 5 October 2012
This is part of Ninety-Nine Haskell Problems, based on Ninety-Nine Prolog Problems and Ninety-Nine Lisp Problems.
1 Problem 1
(*) Find the last element of a list.
(Note that the Lisp transcription of this problem is incorrect.)
Example in Haskell:
Prelude> myLast [1,2,3,4] 4 Prelude> myLast ['x','y','z'] 'z'
2 Problem 2
(*) Find the last but one element of a list.
(Note that the Lisp transcription of this problem is incorrect.)
Example in Haskell:
Prelude> myButLast [1,2,3,4] 3 Prelude> myButLast ['a'..'z'] 'y'
3 Problem 3
(*) Find the K'th element of a list. The first element in the list is number 1.
Example:
* (element-at '(a b c d e) 3) c
Example in Haskell:
Prelude> elementAt [1,2,3] 2 2 Prelude> elementAt "haskell" 5 'e'
4 Problem 4
(*) Find the number of elements of a list.
Example in Haskell:
Prelude> myLength [123, 456, 789] 3 Prelude> myLength "Hello, world!" 13
5 Problem 5
(*) Reverse a list.
Example in Haskell:
Prelude> reverse "A man, a plan, a canal, panama!" "!amanap ,lanac a ,nalp a ,nam A" Prelude> reverse [1,2,3,4] [4,3,2,1]
6 Problem 6
(*) Find out whether a list is a palindrome. A palindrome can be read forward or backward; e.g. (x a m a x).
Example in Haskell:
*Main> isPalindrome [1,2,3] False *Main> isPalindrome "madamimadam" True *Main> isPalindrome [1,2,4,8,16,8,4,2,1] True
7 Problem 7
(**) Flatten a nested list structure.
Transform a list, possibly holding lists as elements into a `flat' list by replacing each list with its elements (recursively).
Example:
* (my-flatten '(a (b (c d) e))) (A B C D E)
Example in Haskell:
We have to define a new data type, because lists in Haskell are homogeneous.
data NestedList a = Elem a | List [NestedList a]
*Main> flatten (Elem 5) [5] *Main> flatten (List [Elem 1, List [Elem 2, List [Elem 3, Elem 4], Elem 5]]) [1,2,3,4,5] *Main> flatten (List []) []
8 Problem 8
(**) Eliminate consecutive duplicates of list elements.
If a list contains repeated elements they should be replaced with a single copy of the element. The order of the elements should not be changed.
Example:
* (compress '(a a a a b c c a a d e e e e)) (A B C A D E)
Example in Haskell:
> compress ["a","a","a","a","b","c","c","a","a","d","e","e","e","e"] ["a","b","c","a","d","e"]
9 Problem 9
(**) Pack consecutive duplicates of list elements into sublists. If a list contains repeated elements they should be placed in separate sublists.
Example:
* (pack '(a a a a b c c a a d e e e e)) ((A A A A) (B) (C C) (A A) (D) (E E E E))
Example in Haskell:
*Main> pack ['a', 'a', 'a', 'a', 'b', 'c', 'c', 'a', 'a', 'd', 'e', 'e', 'e', 'e'] ["aaaa","b","cc","aa","d","eeee"]
10 Problem 10
(*) Run-length encoding of a list. Use the result of problem P09 to implement the so-called run-length encoding data compression method. Consecutive duplicates of elements are encoded as lists (N E) where N is the number of duplicates of the element E.
Example:
* (encode '(a a a a b c c a a d e e e e)) ((4 A) (1 B) (2 C) (2 A) (1 D)(4 E))
Example in Haskell:
encode "aaaabccaadeeee" [(4,'a'),(1,'b'),(2,'c'),(2,'a'),(1,'d'),(4,'e')]
