random puzzle generation

* add random generation of puzzles
* add tests