99 questions/1 to 10: Difference between revisions
m (unify `prelude` and `main` ghci prompts) |
mNo edit summary |
||
(One intermediate revision by one other user not shown) | |||
Line 2: | Line 2: | ||
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]. | 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> | |||
(*) Find the last element of a list. | </div> | ||
<br> | |||
(Note that the Lisp transcription of this problem is incorrect.) | (Note that the Lisp transcription of this problem is incorrect.) | ||
Line 17: | Line 19: | ||
'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> | |||
(*) Find the last but one element of a list. | </div> | ||
<br> | |||
(Note that the Lisp transcription of this problem is incorrect.) | (Note that the Lisp transcription of this problem is incorrect.) | ||
Line 35: | Line 36: | ||
'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: | ||
Line 58: | Line 59: | ||
'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: | ||
Line 74: | Line 74: | ||
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: | ||
Line 90: | Line 89: | ||
[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: | ||
Line 108: | Line 108: | ||
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 141: | Line 140: | ||
</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> | |||
(**) Eliminate consecutive duplicates of list elements. | </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. | 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. | ||
Line 161: | Line 158: | ||
<haskell> | <haskell> | ||
> compress "aaaabccaadeeee" | λ> compress "aaaabccaadeeee" | ||
"abcade" | "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. | ||
Line 187: | Line 185: | ||
</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: | ||
Line 205: | Line 204: | ||
[(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')]