Understanding how to approach programming problems and devise a solution is an essential skill for any Python developer. In this course, you’ll learn new concepts, patterns, and methods that will expand your coding abilities from programming expert, Peter Norvig.

### Why Take This Course?

Move along the path towards becoming an expert programmer! In this class you will practice going from a problem description to a solution, using a series of assignments. During office hours segments, Peter will also share his own personal tips and tricks for approaching programming problems - and his techniques may surprise you!

### Prerequisites and Requirements

This course is intended for experienced Python programmers; students should be familiar with the Python syntax, as well as familiar with the following programming concepts: data structures, basic algorithms, and lambda functions.

This course is intended to challenge you. Be ready to struggle (and learn)!

### Syllabus

#### Lesson 1: Winning Poker Hands

Steps of the design process; Developing for clarity and generality;
Arguments for program correctness; Experimentation and simulation.;
Design tradeoffs; Simplicity and Clarity. Decomposition and composability.

#### Lesson 2: Back of the Envelope

Back of envelope calculations; When to use brute force and when to be
clever; The Zebra puzzle; Generator expressions; Permutations and
combinations. Cryptarithmetic; Recursive and wishful thinking; Longest palindrome
substring algorithm.

#### Lesson 3: Regular Expressions, other languages and interpreters

Defining the language of regular expressions; Interpreting the language;
Defining the set of strings matched by a regular expression;
Other languages.

#### Lesson 4: Dealing with complexity through search

Search: finding your way with a flashlight or boat; pouring water.
Analyzing the efficiency of an algorithm; Recurrence relations; Matching
data types with algorithms.

#### Lesson 5: Dealing with uncertainty through probability

Probability: the game of Pig; Maximizing expected utility to optimize strategy.

#### Lesson 6: Word Games

Managing complexity; Large sets of words; Appropriate data structures; Word games.

#### Lesson 7: Conclusion

Interviews and Practice Exam