diff --git a/ipynb/Dice Baseball.ipynb b/ipynb/Dice Baseball.ipynb index 544b27c..f18be45 100644 --- a/ipynb/Dice Baseball.ipynb +++ b/ipynb/Dice Baseball.ipynb @@ -40,6 +40,7 @@ "- A runner who advances to base 4 or higher has scored a run (unless there are already 3 outs).\n", "- The function `inning` simulates a half inning and returns the number of runs scored.\n", "- I want to be able to test `inning` by feeding it specific events, and I also want to generate random innings. So I'll make the interface be that I pass in an *iterable* of events. The function `event_stream` generates an endless stream of randomly sampled events.\n", + "- Note that it is consider good Pythonic style to automatically convert Booleans to integers, so for a runner on second (`r = 2`) when the event is a single (`e = '1'`), the expression `r + int(e) + (r == 2)` evaluates to `2 + 1 + 1` or `4`, meaning the runner scores.\n", "- I'll play 1 million innings and store the resulting scores in `innings`.\n", "- To simulate a game I just sample 9 elements of `innings` and sum them." ] @@ -70,14 +71,13 @@ " \"Simulate a half inning based on events, and return number of runs scored.\"\n", " outs = runs = 0 # Inning starts with no outs and no runs,\n", " runners = [] # ... and with nobody on base\n", - " for e in iter(events):\n", + " for e in events:\n", " if verbose: print(f'{outs} outs, {runs} runs, event: {e}, runners: {runners}')\n", - " if e in 'KOofD':\n", - " outs += 1 # Batter is out\n", - " else:\n", - " runners.append(0) # Batter becomes a runner\n", - " # See what happens to runners:\n", - " if e == 'D' and 1 in runners: # double play: runner on first is out\n", + " # What happens to the batter?\n", + " if e in 'KOofD': outs += 1 # Batter is out\n", + " elif e in '1234EB': runners.append(0) # Batter becomes a runner\n", + " # What happens to the runners?\n", + " if e == 'D' and 1 in runners: # double play: runner on 1st out, others advance\n", " outs += 1\n", " runners = [r + 1 for r in runners if r != 1]\n", " elif e in 'oE': # out at first or error: runners advance\n", @@ -87,9 +87,9 @@ " runs += 1\n", " elif e in '1234': # single, double, triple, homer\n", " runners = [r + int(e) + (r == 2) for r in runners]\n", - " elif e == 'B': # base on balls; forced runners advance one base\n", + " elif e == 'B': # base on balls: forced runners advance \n", " runners = [r + forced(runners, r) for r in runners]\n", - " # See if inning is over, and if not, whether anyone scored:\n", + " # See if inning is over, and if not, whether anyone scored\n", " if outs >= 3:\n", " return runs\n", " runs += sum(r >= 4 for r in runners)\n", @@ -116,22 +116,17 @@ "name": "stdout", "output_type": "stream", "text": [ - "0 outs, 0 runs, event: 2, runners: []\n", - "0 outs, 0 runs, event: 1, runners: [2]\n", - "0 outs, 1 runs, event: B, runners: [1]\n", - "0 outs, 1 runs, event: 4, runners: [2, 1]\n", - "0 outs, 4 runs, event: 3, runners: []\n", - "0 outs, 4 runs, event: E, runners: [3]\n", - "0 outs, 5 runs, event: f, runners: [1]\n", - "1 outs, 5 runs, event: o, runners: [1]\n", - "2 outs, 5 runs, event: 1, runners: [2]\n", - "2 outs, 6 runs, event: o, runners: [1]\n" + "0 outs, 0 runs, event: o, runners: []\n", + "1 outs, 0 runs, event: 1, runners: []\n", + "1 outs, 0 runs, event: o, runners: [1]\n", + "2 outs, 0 runs, event: 1, runners: [2]\n", + "2 outs, 1 runs, event: o, runners: [1]\n" ] }, { "data": { "text/plain": [ - "6" + "1" ] }, "execution_count": 3, @@ -152,12 +147,13 @@ "name": "stdout", "output_type": "stream", "text": [ - "0 outs, 0 runs, event: O, runners: []\n", - "1 outs, 0 runs, event: 1, runners: []\n", - "1 outs, 0 runs, event: 1, runners: [1]\n", - "1 outs, 0 runs, event: f, runners: [2, 1]\n", - "2 outs, 0 runs, event: 4, runners: [2, 1]\n", - "2 outs, 3 runs, event: O, runners: []\n" + "0 outs, 0 runs, event: E, runners: []\n", + "0 outs, 0 runs, event: 1, runners: [1]\n", + "0 outs, 0 runs, event: 4, runners: [2, 1]\n", + "0 outs, 3 runs, event: o, runners: []\n", + "1 outs, 3 runs, event: 1, runners: []\n", + "1 outs, 3 runs, event: o, runners: [1]\n", + "2 outs, 3 runs, event: O, runners: [2]\n" ] }, { @@ -255,7 +251,7 @@ { "data": { "text/plain": [ - "14.496243" + "14.525194" ] }, "execution_count": 7, @@ -264,7 +260,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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\n", "text/plain": [ "
" ]