Download as pdf or txt
Download as pdf or txt
You are on page 1of 8

Conte nt s in De ta il

Acknowledgments xix

Introduction xxi
Who This Book Is For . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxii
What’s in This Book . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxii
Python Version, Platform, and IDE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxiv
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxiv
Coding Style . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxv
Where to Get Help . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxv
Onward! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxv

1
Silly Name Generator 1
Project #1: Generating Pseudonyms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Planning and Designing a Project . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
The Strategy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
The Pseudocode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
Using the Python Community’s Style Guide . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Checking Your Code with Pylint . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Describing Your Code with Docstrings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
Checking Your Code Style . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Further Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Pseudocode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Style Guides . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Third-Party Modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Practice Projects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Pig Latin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Poor Man’s Bar Chart . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Challenge Projects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
Poor Foreign Man’s Bar Chart . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
The Middle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
Something Completely Different . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

2
Finding Palingram Spells 19
Finding and Opening a Dictionary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
Handling Exceptions When Opening Files . . . . . . . . . . . . . . . . . . . . . . . . . . 21
Loading the Dictionary File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
Project #2: Finding Palindromes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
The Strategy and Pseudocode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
The Palindrome Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
Project #3: Finding Palingrams . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
The Strategy and Pseudocode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
The Palingrams Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
Palingram Profiling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
Palingram Optimization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
dnE ehT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Further Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Practice Project: Dictionary Cleanup . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Challenge Project: Recursive Approach . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

3
Solving Anagrams 35
Project #4: Finding Single-Word Anagrams . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
The Strategy and Pseudocode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
Anagram-Finder Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
Project #5: Finding Phrase Anagrams . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
The Strategy and Pseudocode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
The Anagram Phrase Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
Project #6: Finding Voldemort: The Gallic Gambit . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
Project #7: Finding Voldemort: The British Brute-Force . . . . . . . . . . . . . . . . . . . . . . . . . 51
Strategy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
The British Brute-Force Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
Further Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
Practice Project: Finding Digrams . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
Challenge Project: Automatic Anagram Generator . . . . . . . . . . . . . . . . . . . . . . . . . . . 62

4
Decoding American Civil War Ciphers 63
Project #8: The Route Cipher . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
The Strategy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
The Pseudocode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
The Route Cipher Decryption Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
Hacking the Route Cipher . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
Adding a User Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
Project #9: The Rail Fence Cipher . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
The Strategy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
The Rail Fence Cipher Encryption Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
The Rail Fence Cipher Decryption Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
Further Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
Practice Projects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
Hacking Lincoln . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
Identifying Cipher Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
Storing a Key as a Dictionary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
Automating Possible Keys . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
Route Transposition Cipher: Brute-Force Attack . . . . . . . . . . . . . . . . . . . . . . . . 88
Challenge Projects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
Route Cipher Encoder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
Three-Rail Fence Cipher . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90

xii   Contents in Detail
5
Encoding English Civil War Ciphers 91
Project #10: The Trevanion Cipher . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
Strategy and Pseudocode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
The Trevanion Cipher Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
Project #11: Writing a Null Cipher . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
The List Cipher Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
The List Cipher Output . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
Further Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
Practice Projects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
Saving Mary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
The Colchester Catch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103

6
Writing in Invisible Ink 105
Project #12: Hiding a Vigenère Cipher . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
The Platform . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
The Strategy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
Creating Invisible Ink . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
Manipulating Word Documents with python-docx . . . . . . . . . . . . . . . . . . . . 110
Downloading the Assets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
The Pseudocode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
Importing python-docx, Creating Lists, and Adding a Letterhead . . . . . . . . . . 114
Formatting and Interleaving the Messages . . . . . . . . . . . . . . . . . . . . . . . . . . 115
Adding the Vigenère Cipher . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
Detecting the Hidden Message . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
Further Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
Practice Project: Checking the Number of Blank Lines . . . . . . . . . . . . . . . . . . . . . . . . 122
Challenge Project: Using Monospace Font . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123

7
Breeding Giant Rats with Genetic Algorithms 125
Finding the Best of All Possible Solutions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
Project #13: Breeding an Army of Super-Rats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
Strategy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
The Super-Rats Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
Project #14: Cracking a High-Tech Safe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
Strategy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
The Safecracker Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
Further Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
Challenge Projects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
Building a Rat Harem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
Creating a More Efficient Safecracker . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144

Contents in Detail   xiii
8
Counting Syllables for Haiku Poetry 145
Japanese Haiku . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
Project #15: Counting Syllables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
The Strategy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
Using a Corpus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
Installing NLTK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
Downloading CMUdict . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
Counting Sounds Instead of Syllables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
Handling Words with Multiple Pronunciations . . . . . . . . . . . . . . . . . . . . . . . 150
Managing Missing Words . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
The Training Corpus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
The Missing Words Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
The Count Syllables Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
Prepping, Loading, and Counting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
Defining the main() Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
A Program to Check Your Program . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
Further Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
Practice Project: Syllable Counter vs. Dictionary File . . . . . . . . . . . . . . . . . . . . . . . . . 160

9
Writing Haiku with Markov Chain Analysis 161
Project #16: Markov Chain Analysis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
The Strategy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
Choosing and Discarding Words . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
Continuing from One Line to Another . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
The Pseudocode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
The Training Corpus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
Debugging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
Building the Scaffolding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
Using the logging Module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
Setting Up . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
Building Markov Models . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172
Choosing a Random Word . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
Applying the Markov Models . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
Generating the Haiku Lines . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
Writing the User Interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
The Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
Good Haiku . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
Seed Haiku . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
Further Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
Challenge Projects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
New Word Generator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
Turing Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
Unbelievable! This Is Unbelievable! Unbelievable! . . . . . . . . . . . . . . . . . . . . 185
To Haiku, or Not to Haiku . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
Markov Music . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186

xiv   Contents in Detail
10
Are We Alone? Exploring the Fermi Paradox 187
Project #17: Modeling the Milky Way . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188
The Strategy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
Estimating the Number of Civilizations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
Selecting Radio Bubble Dimensions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
Generating a Formula for the Probability of Detection . . . . . . . . . . . . . . . . . . . . . . . . 192
The Probability-of-Detection Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
Calculating Probability of Detection for a Range of Civilizations . . . . . . . . . . 195
Generating a Predictive Formula and Checking the Results . . . . . . . . . . . . . . 198
Building the Graphical Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
Scaling the Graphical Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
The Galaxy Simulator Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
Further Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
Practice Projects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
A Galaxy Far, Far Away . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
Building a Galactic Empire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
A Roundabout Way to Predict Detectability . . . . . . . . . . . . . . . . . . . . . . . . . 214
Challenge Projects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
Creating a Barred-Spiral Galaxy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
Adding Habitable Zones to Your Galaxy . . . . . . . . . . . . . . . . . . . . . . . . . . 215

11
The Monty Hall Problem 217
Monte Carlo Simulation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
Project #18: Verify vos Savant . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
The Strategy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
The vos Savant Verification Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
Project #19: The Monty Hall Game . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
A Brief Introduction to Object-Oriented Programming . . . . . . . . . . . . . . . . . . 223
The Strategy and Pseudocode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
Game Assets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
The Monty Hall Game Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
Further Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
Practice Project: The Birthday Paradox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238

12
Securing Your Nest Egg 239
Project #20: Simulating Retirement Lifetimes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
The Strategy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
Historical Returns Matter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243
The Greatest Uncertainty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
A Qualitative Way to Present Results . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246
The Pseudocode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248
Finding Historical Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249

Contents in Detail   xv
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250
Importing Modules and Defining Functions to Load Data and Get User Input . . 250
Getting the User Input . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251
Checking for Other Erroneous Input . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
Defining the Monte Carlo Engine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
Simulating Each Year in a Case . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256
Calculating the Probability of Ruin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
Defining and Calling the main() Function . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
Using the Simulator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
Further Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
Challenge Projects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
A Picture Is Worth a Thousand Dollars . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
Mix and Match . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
Just My Luck! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
All the Marbles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264

13
Simulating an Alien Volcano 265
Project #21: The Plumes of Io . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
A Slice of pygame . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
The Strategy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268
Using a Game Sketch to Plan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268
Planning the Particle Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271
Importing Modules, Initiating pygame, and Defining Colors . . . . . . . . . . . . . 271
Defining the Particle Class . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272
Ejecting a Particle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274
Updating the Particle and Handling Boundary Conditions . . . . . . . . . . . . . . . 276
Defining the main() Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277
Completing the main() Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278
Running the Simulation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
Further Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
Practice Project: Going the Distance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282
Challenge Projects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283
Shock Canopy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283
The Fountainhead . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283
With a Bullet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284

14
Mapping Mars with the Mars Orbiter 285
Astrodynamics for Gamers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
The Law of Universal Gravity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
Kepler’s Laws of Planetary Motion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287
Orbital Mechanics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
Project #22: The Mars Orbiter Game . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293
The Strategy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293
Game Assets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296

xvi   Contents in Detail
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297
Importing and Building a Color Table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297
Defining the Satellite Class Initialization Method . . . . . . . . . . . . . . . . . . . . . 298
Setting the Satellite’s Initial Position, Speed, Fuel, and Sound . . . . . . . . . . . . 299
Firing Thrusters and Checking for Player Input . . . . . . . . . . . . . . . . . . . . . . . 300
Locating the Satellite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301
Rotating the Satellite and Drawing Its Orbit . . . . . . . . . . . . . . . . . . . . . . . . . 302
Updating the Satellite Object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
Defining the Planet Class Initialization Method . . . . . . . . . . . . . . . . . . . . . . . 304
Rotating the Planet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306
Defining the gravity() and update() Methods . . . . . . . . . . . . . . . . . . . . . . . . 307
Calculating Eccentricity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308
Defining Functions to Make Labels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309
Mapping Soil Moisture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311
Casting a Shadow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311
Defining the main() Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312
Instantiating Objects, Setting Up Orbit Verification, Mapping,
and Timekeeping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314
Starting the Game Loop and Playing Sounds . . . . . . . . . . . . . . . . . . . . . . . . 315
Applying Gravity, Calculating Eccentricity, and Handling Failure . . . . . . . . . . 316
Rewarding Success and Updating and Drawing Sprites . . . . . . . . . . . . . . . . 318
Displaying Instructions and Telemetry and Casting a Shadow . . . . . . . . . . . . 318
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
Challenge Projects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
Game Title Screen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
Smart Gauges . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
Radio Blackout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
Scoring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
Strategy Guide . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
Aerobraking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
Intruder Alert! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322
Over the Top . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322

15
Improving Your Astrophotography
with Planet Stacking 325
Project #23: Stacking Jupiter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326
The pillow Module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327
Working with Files and Folders . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327
Directory Paths . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328
The Shell Utilities Module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329
The Video . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330
The Strategy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331
The Cropping and Scaling Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331
The Stacking Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337
The Enhancing Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343
Further Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343
Challenge Project: Vanishing Act . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344

Contents in Detail   xvii
16
Finding Frauds with Benford’s Law 347
Project #24: Benford’s Law of Leading Digits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348
Applying Benford’s Law . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350
Performing the Chi-Square Test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352
The Dataset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353
The Strategy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354
The Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355
Importing Modules and Loading Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355
Counting First Digits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356
Getting the Expected Counts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357
Determining Goodness of Fit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357
Defining the Bar Chart Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358
Completing the Bar Chart Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359
Defining and Running the main() Function . . . . . . . . . . . . . . . . . . . . . . . . . . 361
Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363
Further Reading . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364
Practice Project: Beating Benford . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364
Challenge Projects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366
Benfording the Battlegrounds . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366
While No One Was Looking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366

Appendix
Practice Project Solutions 367
Chapter 1: Silly Name Generator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 367
Chapter 2: Finding Palingram Spells . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368
Chapter 3: Solving Anagrams . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 369
Chapter 4: Decoding American Civil War Ciphers . . . . . . . . . . . . . . . . . . . . . . . . . . 370
Chapter 5: Encoding English Civil War Ciphers . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375
Chapter 6: Writing in Invisible Ink . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377
Chapter 8: Counting Syllables for Haiku Poetry . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378
Chapter 10: Are We Alone? Exploring the Fermi Paradox . . . . . . . . . . . . . . . . . . . . . 379
Chapter 11: The Monty Hall Problem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 384
Chapter 13: Simulating an Alien Volcano . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 385
Chapter 16: Finding Frauds with Benford’s Law . . . . . . . . . . . . . . . . . . . . . . . . . . . . 387

index 389

xviii   Contents in Detail

You might also like