solutions to challenges on http://www.pythonchallenge.com/