Difference between revisions of "99 questions/1 to 10"

From HaskellWiki
Jump to navigation Jump to search
(moved solutions 6-10 to new subpages of 99 questions/Solutions, and cleaned up formatting)
(11 intermediate revisions by 9 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://prof.ti.bfh.ch/hew1/informatik3/prolog/p-99/ 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].
 
If you want to work on one of these, put your name in the block so we know someone's working on it. Then, change n in your block to the appropriate problem number, and fill in the <Problem description>,<example in lisp>,<example in Haskell>,<solution in haskell> and <description of implementation> fields.
 
   
 
== Problem 1 ==
 
== Problem 1 ==
Line 14: Line 12:
   
 
<haskell>
 
<haskell>
Prelude> myLast [1,2,3,4]
+
λ> myLast [1,2,3,4]
 
4
 
4
Prelude> myLast ['x','y','z']
+
λ> myLast ['x','y','z']
 
'z'
 
'z'
 
</haskell>
 
</haskell>
Line 32: Line 30:
   
 
<haskell>
 
<haskell>
Prelude> myButLast [1,2,3,4]
+
λ> myButLast [1,2,3,4]
 
3
 
3
Prelude> myButLast ['a'..'z']
+
λ> myButLast ['a'..'z']
 
'y'
 
'y'
 
</haskell>
 
</haskell>
Line 55: Line 53:
   
 
<haskell>
 
<haskell>
Prelude> elementAt [1,2,3] 2
+
λ> elementAt [1,2,3] 2
 
2
 
2
Prelude> elementAt "haskell" 5
+
λ> elementAt "haskell" 5
 
'e'
 
'e'
 
</haskell>
 
</haskell>
Line 71: Line 69:
   
 
<haskell>
 
<haskell>
Prelude> myLength [123, 456, 789]
+
λ> myLength [123, 456, 789]
 
3
 
3
Prelude> myLength "Hello, world!"
+
λ> myLength "Hello, world!"
 
13
 
13
 
</haskell>
 
</haskell>
Line 87: Line 85:
   
 
<haskell>
 
<haskell>
Prelude> reverse "A man, a plan, a canal, panama!"
+
λ> myReverse "A man, a plan, a canal, panama!"
 
"!amanap ,lanac a ,nalp a ,nam A"
 
"!amanap ,lanac a ,nalp a ,nam A"
Prelude> reverse [1,2,3,4]
+
λ> myReverse [1,2,3,4]
 
[4,3,2,1]
 
[4,3,2,1]
 
</haskell>
 
</haskell>
Line 103: Line 101:
   
 
<haskell>
 
<haskell>
*Main> isPalindrome [1,2,3]
+
λ> isPalindrome [1,2,3]
 
False
 
False
*Main> isPalindrome "madamimadam"
+
λ> isPalindrome "madamimadam"
 
True
 
True
*Main> isPalindrome [1,2,4,8,16,8,4,2,1]
+
λ> isPalindrome [1,2,4,8,16,8,4,2,1]
 
True
 
True
 
</haskell>
 
</haskell>
Line 129: Line 127:
 
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]
*Main> flatten (Elem 5)
 
  +
</haskell>
  +
  +
<haskell>
 
λ> flatten (Elem 5)
 
[5]
 
[5]
*Main> flatten (List [Elem 1, List [Elem 2, List [Elem 3, Elem 4], Elem 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]
*Main> flatten (List [])
+
λ> flatten (List [])
 
[]
 
[]
 
</haskell>
 
</haskell>
   
[[99 questions/Solutions/7 | Solutions]]
 
   
  +
 
[[99 questions/Solutions/7 | Solutions]]
   
 
== Problem 8 ==
 
== Problem 8 ==
Line 157: Line 161:
   
 
<haskell>
 
<haskell>
  +
λ> compress "aaaabccaadeeee"
*Main> compress ['a','a','a','a','b','c','c','a','a','d','e','e','e','e']
 
  +
"abcade"
['a','b','c','a','d','e']
 
 
</haskell>
 
</haskell>
   
 
[[99 questions/Solutions/8 | Solutions]]
 
[[99 questions/Solutions/8 | Solutions]]
 
   
 
== Problem 9 ==
 
== Problem 9 ==
Line 179: Line 182:
   
 
<haskell>
 
<haskell>
*Main> 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']
 
["aaaa","b","cc","aa","d","eeee"]
 
["aaaa","b","cc","aa","d","eeee"]
 
</haskell>
 
</haskell>
   
 
[[99 questions/Solutions/9 | Solutions]]
 
[[99 questions/Solutions/9 | Solutions]]
 
   
 
== Problem 10 ==
 
== Problem 10 ==
Line 199: Line 202:
 
Example in Haskell:
 
Example in Haskell:
 
<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>

Revision as of 09:06, 9 February 2019


This is part of Ninety-Nine Haskell Problems, based on Ninety-Nine Prolog Problems and Ninety-Nine Lisp Problems.

Problem 1

(*) Find the last element of a list.

(Note that the Lisp transcription of this problem is incorrect.)

Example in Haskell:

λ> myLast [1,2,3,4]
4
λ> myLast ['x','y','z']
'z'

Solutions


Problem 2

(*) Find the last but one element of a list.

(Note that the Lisp transcription of this problem is incorrect.)

Example in Haskell:

λ> myButLast [1,2,3,4]
3
λ> myButLast ['a'..'z']
'y'

Solutions


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:

λ> elementAt [1,2,3] 2
2
λ> elementAt "haskell" 5
'e'

Solutions


Problem 4

(*) Find the number of elements of a list.

Example in Haskell:

λ> myLength [123, 456, 789]
3
λ> myLength "Hello, world!"
13

Solutions


Problem 5

(*) Reverse a list.

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]

Solutions


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:

λ> isPalindrome [1,2,3]
False
λ> isPalindrome "madamimadam"
True
λ> isPalindrome [1,2,4,8,16,8,4,2,1]
True

Solutions


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]
λ> 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 [])
[]


Solutions

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 "aaaabccaadeeee"
"abcade"

Solutions

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:

λ> pack ['a', 'a', 'a', 'a', 'b', 'c', 'c', 'a', 
             'a', 'd', 'e', 'e', 'e', 'e']
["aaaa","b","cc","aa","d","eeee"]

Solutions

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')]

Solutions