http://ocaml.org/learn/tutorials/99problems.html