Algorithmic Problem Solving with Python