Programming for the Puzzled (Learn to Program While Solving Puzzles)