99 questions/1 to 10: Difference between revisions
No edit summary |
mNo edit summary |
||
(25 intermediate revisions by 14 users 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:// | 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 == | ||
<div style="border-bottom:1px solid #eee">(*) Find the last element of a list. <span style="float:right"><small>[[99 questions/Solutions/1|Solutions]]</small></span> | |||
</div> | |||
<br> | |||
(Note that the Lisp transcription of this problem is incorrect.) | |||
(Note | |||
Example in Haskell: | Example in Haskell: | ||
<haskell> | <haskell> | ||
λ> myLast [1,2,3,4] | |||
4 | 4 | ||
λ> myLast ['x','y','z'] | |||
'z' | 'z' | ||
</haskell> | </haskell> | ||
== Problem 2 == | == Problem 2 == | ||
<div style="border-bottom:1px solid #eee">(*) Find the last-but-one (or second-last) element of a list. <span style="float:right"><small>[[99 questions/Solutions/2|Solutions]]</small></span> | |||
</div> | |||
<br> | |||
(Note that the Lisp transcription of this problem is incorrect.) | |||
(Note | |||
Example in Haskell: | Example in Haskell: | ||
<haskell> | <haskell> | ||
λ> myButLast [1,2,3,4] | |||
3 | 3 | ||
λ> myButLast ['a'..'z'] | |||
'y' | 'y' | ||
</haskell> | </haskell> | ||
== Problem 3 == | == Problem 3 == | ||
<div style="border-bottom:1px solid #eee">(*) Find the K'th element of a list. <span style="float:right"><small>[[99 questions/Solutions/3|Solutions]]</small></span> | |||
</div> | |||
<br> | |||
The first element in the list is number 1. | |||
Example: | Example: | ||
<pre> | <pre> | ||
* (element-at '(a b c d e) 3) | * (element-at '(a b c d e) 3) | ||
c | |||
</pre> | </pre> | ||
Line 77: | Line 54: | ||
<haskell> | <haskell> | ||
λ> elementAt [1,2,3] 2 | |||
2 | 2 | ||
λ> elementAt "haskell" 5 | |||
'e' | 'e' | ||
</haskell> | </haskell> | ||
== Problem 4 == | == Problem 4 == | ||
<div style="border-bottom:1px solid #eee">(*) Find the number of elements in a list. <span style="float:right"><small>[[99 questions/Solutions/4|Solutions]]</small></span> | |||
(*) Find the number of elements | </div> | ||
<br> | |||
Example in Haskell: | Example in Haskell: | ||
<haskell> | <haskell> | ||
λ> myLength [123, 456, 789] | |||
3 | 3 | ||
λ> myLength "Hello, world!" | |||
13 | 13 | ||
</haskell> | </haskell> | ||
== Problem 5 == | == Problem 5 == | ||
<div style="border-bottom:1px solid #eee">(*) Reverse a list. <span style="float:right"><small>[[99 questions/Solutions/5|Solutions]]</small></span> | |||
(*) Reverse a list. | </div> | ||
<br> | |||
Example in Haskell: | Example in Haskell: | ||
<haskell> | <haskell> | ||
λ> myReverse "A man, a plan, a canal, panama!" | |||
"!amanap ,lanac a ,nalp a ,nam A" | "!amanap ,lanac a ,nalp a ,nam A" | ||
λ> myReverse [1,2,3,4] | |||
[4,3,2,1] | [4,3,2,1] | ||
</haskell> | </haskell> | ||
== Problem 6 == | == Problem 6 == | ||
<div style="border-bottom:1px solid #eee">(*) Find out whether a list is a palindrome. <span style="float:right"><small>[[99 questions/Solutions/6|Solutions]]</small></span> | |||
</div> | |||
<br> | |||
Hint: A palindrome can be read forward or backward; e.g. (x a m a x). | |||
Example in Haskell: | Example in Haskell: | ||
<haskell> | <haskell> | ||
λ> isPalindrome [1,2,3] | |||
False | False | ||
λ> isPalindrome "madamimadam" | |||
True | True | ||
λ> isPalindrome [1,2,4,8,16,8,4,2,1] | |||
True | True | ||
</haskell> | </haskell> | ||
== Problem 7 == | == Problem 7 == | ||
<div style="border-bottom:1px solid #eee">(**) Flatten a nested list structure. <span style="float:right"><small>[[99 questions/Solutions/7|Solutions]]</small></span> | |||
(**) Flatten a nested list structure. | </div> | ||
<br> | |||
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). | ||
Line 203: | Line 126: | ||
Example in Haskell: | 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] | |||
</haskell> | |||
<haskell> | |||
λ> flatten (Elem 5) | |||
[5] | [5] | ||
λ> flatten (List [Elem 1, List [Elem 2, List [Elem 3, Elem 4], Elem 5]]) | |||
[1,2,3,4,5] | [1,2,3,4,5] | ||
λ> flatten (List []) | |||
[] | [] | ||
</haskell> | </haskell> | ||
== Problem 8 == | == Problem 8 == | ||
<div style="border-bottom:1px solid #eee">(**) Eliminate consecutive duplicates of list elements. <span style="float:right"><small>[[99 questions/Solutions/8|Solutions]]</small></span> | |||
</div> | |||
<br> | |||
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: | |||
<pre> | <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 | λ> compress "aaaabccaadeeee" | ||
"abcade" | |||
</haskell> | </haskell> | ||
== Problem 9 == | == Problem 9 == | ||
<div style="border-bottom:1px solid #eee">(**) Pack consecutive duplicates of list elements into sublists. <span style="float:right"><small>[[99 questions/Solutions/9|Solutions]]</small></span> | |||
</div> | |||
<br> | |||
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> | ||
pack | λ> pack ['a', 'a', 'a', 'a', 'b', 'c', 'c', 'a', | ||
'a', 'd', 'e', 'e', 'e', 'e'] | |||
["aaaa","b","cc","aa","d","eeee"] | |||
</haskell> | </haskell> | ||
== Problem 10 == | == Problem 10 == | ||
<div style="border-bottom:1px solid #eee">(*) Run-length encoding of a list. <span style="float:right"><small>[[99 questions/Solutions/10|Solutions]]</small></span> | |||
</div> | |||
<br> | |||
Use the result of Problem 9 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. | |||
Use the result of | |||
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> | ||
[[Category:Tutorials]] | [[Category:Tutorials]] |
Latest revision as of 05:27, 10 June 2023
This is part of Ninety-Nine Haskell Problems, based on Ninety-Nine Prolog Problems and Ninety-Nine Lisp Problems.
Problem 1
(Note that the Lisp transcription of this problem is incorrect.)
Example in Haskell:
λ> myLast [1,2,3,4]
4
λ> myLast ['x','y','z']
'z'
Problem 2
(Note that the Lisp transcription of this problem is incorrect.)
Example in Haskell:
λ> myButLast [1,2,3,4]
3
λ> myButLast ['a'..'z']
'y'
Problem 3
The first element in the list is number 1. Example:
* (element-at '(a b c d e) 3) c
Example in Haskell:
λ> elementAt [1,2,3] 2
2
λ> elementAt "haskell" 5
'e'
Problem 4
Example in Haskell:
λ> myLength [123, 456, 789]
3
λ> myLength "Hello, world!"
13
Problem 5
Example in Haskell:
λ> myReverse "A man, a plan, a canal, panama!"
"!amanap ,lanac a ,nalp a ,nam A"
λ> myReverse [1,2,3,4]
[4,3,2,1]
Problem 6
Hint: A palindrome can be read forward or backward; e.g. (x a m a x).
Example in Haskell:
λ> isPalindrome [1,2,3]
False
λ> isPalindrome "madamimadam"
True
λ> isPalindrome [1,2,4,8,16,8,4,2,1]
True
Problem 7
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]
λ> flatten (Elem 5)
[5]
λ> flatten (List [Elem 1, List [Elem 2, List [Elem 3, Elem 4], Elem 5]])
[1,2,3,4,5]
λ> flatten (List [])
[]
Problem 8
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 "aaaabccaadeeee"
"abcade"
Problem 9
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:
λ> pack ['a', 'a', 'a', 'a', 'b', 'c', 'c', 'a',
'a', 'd', 'e', 'e', 'e', 'e']
["aaaa","b","cc","aa","d","eeee"]
Problem 10
Use the result of Problem 9 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')]