# 99 questions/1 to 10

### From HaskellWiki

(Added an alternative solution to Problem 2 that is a lot more like the solution to Problem 1.) |
m (Avoid name clashes with prelude (using naming scheme of problems 1, 2 & 4)) |
||

(35 intermediate revisions by 18 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 [ | + | 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: | ||

Line 20: | Line 13: | ||

<haskell> | <haskell> | ||

Prelude> myLast [1,2,3,4] | Prelude> myLast [1,2,3,4] | ||

− | + | 4 | |

Prelude> myLast ['x','y','z'] | Prelude> myLast ['x','y','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: | Example in Haskell: | ||

Line 50: | Line 31: | ||

<haskell> | <haskell> | ||

Prelude> myButLast [1,2,3,4] | Prelude> myButLast [1,2,3,4] | ||

− | + | 3 | |

Prelude> myButLast ['a'..'z'] | Prelude> myButLast ['a'..'z'] | ||

− | + | 'y' | |

</haskell> | </haskell> | ||

− | + | [[99 questions/Solutions/2 | Solutions]] | |

− | |||

− | |||

− | |||

− | |||

− | |||

− | |||

− | |||

− | |||

− | |||

− | |||

− | |||

− | |||

− | |||

− | |||

− | |||

− | |||

− | |||

− | |||

− | |||

− | |||

− | |||

− | |||

− | |||

− | |||

− | |||

− | |||

− | |||

− | |||

− | |||

− | |||

== Problem 3 == | == Problem 3 == | ||

Line 96: | Line 47: | ||

<pre> | <pre> | ||

* (element-at '(a b c d e) 3) | * (element-at '(a b c d e) 3) | ||

− | + | c | |

</pre> | </pre> | ||

Line 108: | Line 59: | ||

</haskell> | </haskell> | ||

− | + | [[99 questions/Solutions/3 | Solutions]] | |

− | |||

− | |||

− | |||

− | |||

− | |||

− | |||

− | |||

− | |||

− | |||

− | |||

− | |||

− | |||

− | |||

− | |||

== Problem 4 == | == Problem 4 == | ||

Line 132: | Line 69: | ||

<haskell> | <haskell> | ||

− | Prelude> | + | Prelude> myLength [123, 456, 789] |

3 | 3 | ||

− | Prelude> | + | Prelude> myLength "Hello, world!" |

13 | 13 | ||

</haskell> | </haskell> | ||

− | + | [[99 questions/Solutions/4 | Solutions]] | |

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | |||

== Problem 5 == | == Problem 5 == | ||

Line 155: | Line 85: | ||

<haskell> | <haskell> | ||

− | Prelude> | + | Prelude> myReverse "A man, a plan, a canal, panama!" |

"!amanap ,lanac a ,nalp a ,nam A" | "!amanap ,lanac a ,nalp a ,nam A" | ||

− | Prelude> | + | Prelude> myReverse [1,2,3,4] |

[4,3,2,1] | [4,3,2,1] | ||

</haskell> | </haskell> | ||

− | + | [[99 questions/Solutions/5 | Solutions]] | |

− | |||

− | |||

− | |||

− | |||

− | |||

− | |||

− | |||

− | |||

− | |||

− | |||

− | |||

− | |||

== Problem 6 == | == Problem 6 == | ||

Line 191: | Line 109: | ||

</haskell> | </haskell> | ||

− | + | [[99 questions/Solutions/6 | Solutions]] | |

− | |||

− | |||

− | |||

− | |||

== Problem 7 == | == Problem 7 == | ||

Line 212: | Line 126: | ||

Example in Haskell: | Example in Haskell: | ||

+ | |||

+ | We have to define a new data type, because lists in Haskell are homogeneous. | ||

+ | <haskell> | ||

+ | data NestedList a = Elem a | List [NestedList a] | ||

+ | </haskell> | ||

<haskell> | <haskell> | ||

Line 222: | Line 141: | ||

</haskell> | </haskell> | ||

− | |||

− | |||

− | |||

− | + | [[99 questions/Solutions/7 | Solutions]] | |

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

== Problem 8 == | == Problem 8 == | ||

Line 244: | Line 150: | ||

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: | ||

<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> | ||

− | + | [[99 questions/Solutions/8 | Solutions]] | |

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

− | + | ||

== Problem 9 == | == Problem 9 == | ||

Line 283: | 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 310: | 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]] |

## Latest revision as of 08:17, 27 February 2013

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

## [edit] 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'

## [edit] 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'

## [edit] 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'

## [edit] 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

## [edit] 5 Problem 5

(*) Reverse a list.

Example in Haskell:

Prelude> myReverse "A man, a plan, a canal, panama!" "!amanap ,lanac a ,nalp a ,nam A" Prelude> myReverse [1,2,3,4] [4,3,2,1]

## [edit] 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

## [edit] 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 []) []

## [edit] 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 "aaaabccaadeeee" "abcade"

## [edit] 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"]

## [edit] 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')]