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