Add files via upload
This commit is contained in:
1 parent
925beda6a5
commit
de3e677ab6
1 file changed
+226
-193
+226
-193
@@ -9,39 +9,39 @@
|
||||
"# Poker: Ranking Hands, etc.\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"The [rules for poker hands](https://en.wikipedia.org/wiki/List_of_poker_hands) are complex, but it is an interesting exercise to write a program to rank poker hands—to determine if one is higher or lower than another—as I did in my [Udacity 212](https://www.udacity.com/course/design-of-computer-programs--cs212) course after making a [cheesy video](https://www.youtube.com/watch?v=PI8Fo1vzUPM) with David Evans. We'll cover only the ranking part of poker, not the betting part. Some key concepts:\n",
|
||||
"The [rules for poker hands](https://en.wikipedia.org/wiki/List_of_poker_hands) are complex, but it is an interesting exercise to write a program to rank poker hands—to determine if one is higher or lower than another—as I did in my [Udacity 212](https://www.udacity.com/course/design-of-computer-programs--cs212) course after making a [cheesy video](https://www.youtube.com/watch?v=PI8Fo1vzUPM) with David Evans. We'll cover only the ranking part of poker, not the betting part. \n",
|
||||
"\n",
|
||||
"Some key concepts:\n",
|
||||
"\n",
|
||||
"- **Card**: A card will be represented as a two character string, like `'9c'`, where the first character is the **rank** and the second is the **suit**. The ranks are `23456789TJQKA` in ascending order of value and the suits are `'cdhs'` for clubs, diamonds, hearts, and spades; all suits have equal value in poker. I thought about using the Unicode characters `'♣︎♢♡♠︎'`, but they are hard to find on the keyboard. I also thought of using `(10, 0)` instead of `'Tc'`; the former might allow for a bit faster code, but the later is easier to look at when debugging.\n",
|
||||
"- **Hand**: A hand is a sequence of five cards: `['3s', '3c', 'As', 'Ks', 'Qs']`\n",
|
||||
"- **Type**: A hand has a ranking **type**; these are (in highest to lowest order): five of a kind, straight flush, four of a kind, full house, flush, straight, three of a kind, two pair, one pair, high card. (Five of a kind can only be made in games with wild cards.)\n",
|
||||
"- **Group**: A collection of cards with the same rank: a pair, a three-of-a-kind, etc.\n",
|
||||
"- **Winning**: If two hands have different types, the higher type wins. If they have the same type, a **tiebreaker** is needed. For example, the tiebreaker for \"straight\" is the rank of the highest card; a ten-high straight beats a nine-high straight.\n",
|
||||
"- **Ranking**: To determine who wins, we assign a **ranking** to each hand; the ranking encompasses the type and tiebreaker. The winner is the hand with the highest ranking. Note that the word **ranking** refers to the value of a *hand*, but **rank** refers to the value of a *card*."
|
||||
"- **Hand**: A hand is a collection of five cards: `['3s', '3c', 'As', 'Ks', 'Qs']`\n",
|
||||
"- **Type**: A hand has a ranking type; these are (in highest to lowest order): five of a kind, straight flush, four of a kind, full house, flush, straight, three of a kind, two pair, one pair, high card. (Five of a kind can only be made in games with wild cards.)\n",
|
||||
"- **Group**: Two or more cards with the same rank: a pair, a three-of-a-kind, etc.\n",
|
||||
"- **Winning**: If two hands have different types, the higher type wins. If they have the same type, a **tiebreaker** is needed. \n",
|
||||
"- **Tiebreaker**: For example, the tiebreaker for \"straight\" is the rank of the highest card; a ten-high straight beats a nine-high straight. The tiebreaker for \"three of a kind\" is the rank of the three-of-a-kind group.\n",
|
||||
"- **Ranking**: To determine which hand wins we could have a comparison function, `compare_ranks(hand1, hand2)`. But it is simpler to compare ranks with `ranking(hand) < ranking(hand2)`. The function `ranking` returns a tuple that encompasses the type and tiebreaker. Note that the word **ranking** refers to the value of a *hand*, but **rank** refers to the value of a *card*."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Ranking and Integer Partitions\n",
|
||||
"# Ranking and Integer Partitions: `ranking0`\n",
|
||||
"\n",
|
||||
"There is a curious correspondence between the seven types of poker hands that involve groups and the seven **[integer partitions](https://en.wikipedia.org/wiki/Partition_(number_theory))** of the number 5. \n",
|
||||
"There is a curious correspondence between the seven types of poker hands that involve groups (that is, all the types except the ones for straights and flushes) and the seven **[integer partitions](https://en.wikipedia.org/wiki/Partition_(number_theory))** of the number 5 (remember, there are 5 cards in a hand). \n",
|
||||
"\n",
|
||||
"Consider this table of ranking types:\n",
|
||||
"Consider this table of ranking types, where the straights and flushes are omitted:\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"| Type| # | Example |Partitions |\n",
|
||||
"|-|--|---|---|\n",
|
||||
"| Five of a kind |9|`As Ac Ah Ad Aj`| (5,) |\n",
|
||||
"| Straight flush |8|`As Ks Qs Ts Js`| |\n",
|
||||
"| Four of a kind |7|`7s 7c 7d 2d 7h`| (4, 1)|\n",
|
||||
"| Full house |6| `8h 9c 8d 8c 9h`| (3, 2)|\n",
|
||||
"| Flush |5| `8c Kc Qc Jc Tc`| |\n",
|
||||
"| Straight |4| `Kc Qh Jd Th 9c`| |\n",
|
||||
"| Three of a kind |3| `Ts Tc Th 9s 7c`| (3, 1, 1)|\n",
|
||||
"| Two pair |2| `Ts Tc 9s 9c 7h`| (2, 2, 1) |\n",
|
||||
"| One pair |1| `3s 3c As Ks Qs`| (2, 1, 1, 1)|\n",
|
||||
"| High card |0| `2s 4s 5s 6s 7h`| (1, 1, 1, 1, 1)|\n",
|
||||
"| Type| Example |Partitions |\n",
|
||||
"|-|---|---|\n",
|
||||
"| Five of a kind |`As Ac Ah Ad Aj`| (5,) |\n",
|
||||
"| Four of a kind |`7s 7c 7d 2d 7h`| (4, 1)|\n",
|
||||
"| Full house | `8h 9c 8d 8c 9h`| (3, 2)|\n",
|
||||
"| Three of a kind | `Ts Tc Th 9s 7c`| (3, 1, 1)|\n",
|
||||
"| Two pair | `Ts Tc 9s 9c 7h`| (2, 2, 1) |\n",
|
||||
"| One pair | `3s 3c As Ks Qs`| (2, 1, 1, 1)|\n",
|
||||
"| High card | `2s 4s 5s 6s 7h`| (1, 1, 1, 1, 1)|\n",
|
||||
"\n",
|
||||
"The types are sorted from highest to lowest, and the partitions are also sorted in lexicographic order from highest to lowest. The correspondence is that, for example, `(3, 2)` means \"three cards of one rank and two cards of another rank\", which is the definition of a full house. \n",
|
||||
"\n",
|
||||
@@ -116,7 +116,7 @@
|
||||
"source": [
|
||||
"This gives us all the information we need; the problem is that it is not in the right format to compare rankings. We can't do `counter1 < counter2` because Counters do not support comparison. But we can reformat the information into a tuple consisting of two components: \n",
|
||||
" 1. The **type** of hand, full house, which is denoted by the partition `(3, 2)`.\n",
|
||||
" 2. The **tiebreakers**: among all full houses, ties go to the highest three-of-a-kind card, and if those are the same, then the highest pair card. So the tiebreaker for this hand would be `(8, 9)`. (Even though 9 > 8, the 8 comes first because the three-of-a-kind is more important than the pair.)\n",
|
||||
" 2. The **tiebreakers**: among all full houses, ties go to the highest three-of-a-kind rank, and if those are the same, then the highest pair rank. So the tiebreaker for this hand would be `(8, 9)`. (Even though 9 > 8, the 8 comes first because the three-of-a-kind is more important than the pair.)\n",
|
||||
"\n",
|
||||
"Thus the complete ranking for this hand is the tuple `((3, 2), (8, 9))`. The same information as in the Counter, but in the proper order for sorting.\n",
|
||||
"\n",
|
||||
@@ -129,7 +129,7 @@
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def ranking(hand) -> tuple:\n",
|
||||
"def ranking0(hand) -> tuple:\n",
|
||||
" \"\"\"Return a (type, tiebreaker) tuple indicating how high the hand ranks.\"\"\"\n",
|
||||
" counts = Counter(map(rank, hand))\n",
|
||||
" groups = sorted(((counts[r], r) for r in counts), reverse=True)\n",
|
||||
@@ -240,7 +240,7 @@
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"ranking(hand)"
|
||||
"ranking0(hand)"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -260,7 +260,7 @@
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"ranking(hand2)"
|
||||
"ranking0(hand2)"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -280,16 +280,16 @@
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"ranking(hand) > ranking(hand2)"
|
||||
"ranking0(hand) > ranking0(hand2)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Ranking Straights and Flushes\n",
|
||||
"# Complete Ranking: `ranking1`\n",
|
||||
"\n",
|
||||
"It is a cute mathematical result that poker rankings correspond to the integer partitions of 5, but the correspondence does not account for straights and flushes. Still, we can salvage the approach by inventing \"type tuples\" for straight, flush, and straight flush that are not partitions but are in the correct sort order with respect to the seven actual partitions. There are many possible choices; my choices, shown in **bold** below, are to look at the type one row below and add 1 to the last digit: one better than `(3, 1, 1)` is `(3, 1, 2)`; one better than `(4, 1)` is `(4, 2)`.\n",
|
||||
"It is a cute mathematical result that poker rankings correspond to the integer partitions of 5, but the correspondence does not account for straights and flushes. Still, we can salvage the approach by inventing \"type tuples\" for straight, flush, and straight flush that are not partitions but are in the correct sort order with respect to the seven actual partitions of 5. There are many possible choices; my choices, shown in **bold** below, are to look at the type one row below and add 1 to the last digit: one better than `(3, 1, 1)` is `(3, 1, 2)`; one better than `(4, 1)` is `(4, 2)`.\n",
|
||||
"\n",
|
||||
"\n",
|
||||
"| Type| # | Example |Type tuple |\n",
|
||||
@@ -314,14 +314,15 @@
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def ranking(hand) -> tuple:\n",
|
||||
"def ranking1(hand) -> tuple:\n",
|
||||
" \"\"\"Return a value indicating how high the hand ranks.\"\"\"\n",
|
||||
" counts = Counter(map(rank, hand))\n",
|
||||
" groups = sorted(((counts[r], r) for r in counts), reverse=True)\n",
|
||||
" type, ranks = zip(*groups)\n",
|
||||
" if ranks == (14, 5, 4, 3, 2):\n",
|
||||
" ranks = (5, 4, 3, 2, 1)\n",
|
||||
" return special_type(hand, ranks) or type, ranks\n",
|
||||
" type = special_type(hand, ranks) or type\n",
|
||||
" return (type, ranks)\n",
|
||||
"\n",
|
||||
"def special_type(hand, ranks) -> tuple:\n",
|
||||
" \"\"\"For a flush or straight, return a tuple comparable with `type` in `ranking`.\"\"\"\n",
|
||||
@@ -331,7 +332,9 @@
|
||||
" (3, 1, 3) if flush else \n",
|
||||
" (3, 1, 2) if straight else ())\n",
|
||||
"\n",
|
||||
"def the_same(things) -> bool: return len(set(things)) <= 1"
|
||||
"def the_same(things) -> bool: \n",
|
||||
" \"\"\"Are all the things actually the same?\"\"\"\n",
|
||||
" return len(set(things)) <= 1"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -340,7 +343,10 @@
|
||||
"source": [
|
||||
"# Testing Poker Hands\n",
|
||||
"\n",
|
||||
"Below is a list of `hands`, with four examples of each **type**, all in descending ranking order (i.e. best to worst). The `test` function asserts that (1) the `ranking` function agrees with this ordering; (2) the order of cards within a hand does not matter—every permutation of cards is ranked the same; and (3) swapping the suits around (e.g. swapping every spade with every club) does not change the ranking."
|
||||
"Below is a list of `hands`, with four examples of each **type**, all in descending ranking order (i.e. best to worst). The `test` function asserts that:\n",
|
||||
"- The `ranking` function agrees with this ordering.\n",
|
||||
"- The order of cards within a hand does not matter—every permutation of cards is ranked the same. \n",
|
||||
"- Swapping the suits around (e.g. swapping every spade with every heart) does not change the ranking."
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -365,7 +371,7 @@
|
||||
"def test(ranking, hands=hands) -> bool:\n",
|
||||
" \"\"\"Test that `ranking` preserves order of `hands`, and that permuting cards is irrelevant.\"\"\"\n",
|
||||
" assert hands == sorted(hands, key=ranking, reverse=True)\n",
|
||||
" trans = str.maketrans('shdc', 'cdhs')\n",
|
||||
" trans = str.maketrans('shdc', 'hscd')\n",
|
||||
" for hand in hands: \n",
|
||||
" assert the_same(ranking(h) for h in permutations(hand))\n",
|
||||
" assert the_same([ranking(hand), ranking([c.translate(trans) for c in hand])])\n",
|
||||
@@ -389,14 +395,14 @@
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"test(ranking)"
|
||||
"test(ranking1)"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"Let's see what rankings look like:"
|
||||
"Let's see what the rankings look like:"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -455,7 +461,7 @@
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"{join(h): ranking(h) for h in hands}"
|
||||
"{join(h): ranking1(h) for h in hands}"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -597,7 +603,7 @@
|
||||
"source": [
|
||||
"# Timing\n",
|
||||
"\n",
|
||||
"Below we see that `ranking2` is about 15% faster than `ranking`, so use `ranking2` when speed is important."
|
||||
"Below we see that `ranking2` is about 25% faster than `ranking1`, so use `ranking2` when speed is important."
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -609,13 +615,13 @@
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"31.1 ms ± 4.34 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n",
|
||||
"27.1 ms ± 3.48 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)\n"
|
||||
"24.5 ms ± 381 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)\n",
|
||||
"19.6 ms ± 432 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"%timeit test(ranking, hands)\n",
|
||||
"%timeit test(ranking1, hands)\n",
|
||||
"%timeit test(ranking2, hands)"
|
||||
]
|
||||
},
|
||||
@@ -654,7 +660,7 @@
|
||||
"source": [
|
||||
"# Type Names\n",
|
||||
"\n",
|
||||
"So far, the names of the types (e.g. \"full house\") have appeared only in prose, not in the code. Let's fix that. We'll take advantage of the fact that the first element of the tuple returned by `ranking2` is an integer ranging from 0 to 9 that can be used as an index into a tuple of `type_names`:"
|
||||
"So far, the names of the types (e.g. \"full house\") have appeared only in prose, not in the code. Let's fix that. The hand type returned by `ranking2` is an integer ranging from 0 to 9 that can be used as an index into a tuple of `type_names`:"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -918,9 +924,9 @@
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"joker ='**'\n",
|
||||
"deck = [r + s for r in rankstr for s in 'cdhs'] # Regular Deck of 52 cards\n",
|
||||
"jdeck = [joker, joker, *deck] # Deck of 54 cards including two jokers\n",
|
||||
"joker ='**'\n",
|
||||
"deck = [r + s for r in rankstr for s in 'cdhs'] # Regular Deck of 52 cards\n",
|
||||
"deck54 = [joker, joker, *deck] # Deck of 54 cards including two jokers\n",
|
||||
"\n",
|
||||
"def joker_best(hand) -> Hand:\n",
|
||||
" \"\"\"Find the best hand by replacing any jokers with any other card.\"\"\"\n",
|
||||
@@ -1038,7 +1044,7 @@
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"With that I can define `win_probability`:"
|
||||
"This says that 50.1% of all random hands have the type \"high card\", 92.3% are \"high card\" or \"one pair\", 97.1% are \"two pair\" or worse, and so on. With this I can define `win_probability`:"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -1177,27 +1183,54 @@
|
||||
"This says that with the given hand the best action is to discard the low card, the 2 of diamonds. Drawing a new card could give us a pair of 4s, 7s, 9s, or aces, or it could leave us with only an ace high. "
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 39,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"'Kc'"
|
||||
]
|
||||
},
|
||||
"execution_count": 39,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"draw_best_action(cards('2d 3d 4d Kc As'))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"This time the best action is to discard the King, even though it is a high card, to try for the straight."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"# Gathering Statistics for Type Probabilities\n",
|
||||
"\n",
|
||||
"I would like to gather some hand-type probabilities, like [Wikipedia's probabilities](https://en.wikipedia.org/wiki/Poker_probability), for different game variants. When we are just dealing five cards, it is easy enough to use combinatorics to compute exactly the proportion of hands of each type. But with complex games involving drawing from the deck or choosing community cards it is easier to estimate probabilities by doing a simulation.\n",
|
||||
"I would like to gather some hand-type probabilities for different game variants. When we are just dealing five cards, it is easy enough to use combinatorics to compute exactly the proportion of hands of each type, as [Wikipedia's does](https://en.wikipedia.org/wiki/Poker_probability). But with complex games involving drawing from the deck or choosing community cards it can be easier to estimate probabilities by doing a simulation.\n",
|
||||
"\n",
|
||||
"I'll use the notion of a **handmaker**: a function of zero arguments (except maybe optional parameters) that when called returns a random hand, according to the best possible strategy. So `texas_handmaker` deals seven cards, uses `split` to split them into 2 hole cards and 5 community cards, and then determines the best hand that can be made from those cards with `texas_best`. The other handmaker functions do likewise. The `draw_handmaker` samples 5 cards, decides what the optimal action is, and then draws a random card to replace the discard."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 39,
|
||||
"execution_count": 40,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"def deal_handmaker() -> Hand: return deal(5)\n",
|
||||
"def texas_handmaker() -> Hand: return texas_best(*deal(2, 5))\n",
|
||||
"def omaha_handmaker() -> Hand: return omaha_best(*deal(4, 5))\n",
|
||||
"def joker_handmaker() -> Hand: return joker_best(deal(5, deck=jdeck))\n",
|
||||
"def joker_handmaker() -> Hand: return joker_best(deal(5, deck=deck54))\n",
|
||||
"def threeD_handmaker() -> Hand: return threeD_best(*deal(2, 15))\n",
|
||||
"\n",
|
||||
"def draw_handmaker(P=deal_win_P) -> Hand:\n",
|
||||
@@ -1211,7 +1244,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 40,
|
||||
"execution_count": 41,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -1236,7 +1269,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 41,
|
||||
"execution_count": 42,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -1248,23 +1281,23 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 42,
|
||||
"execution_count": 43,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"Counter({'one pair': 424,\n",
|
||||
" 'high card': 490,\n",
|
||||
" 'flush': 4,\n",
|
||||
" 'three of a kind': 16,\n",
|
||||
" 'two pair': 56,\n",
|
||||
"Counter({'high card': 508,\n",
|
||||
" 'one pair': 421,\n",
|
||||
" 'flush': 2,\n",
|
||||
" 'two pair': 44,\n",
|
||||
" 'full house': 3,\n",
|
||||
" 'straight': 6,\n",
|
||||
" 'three of a kind': 18,\n",
|
||||
" 'straight': 3,\n",
|
||||
" 'four of a kind': 1})"
|
||||
]
|
||||
},
|
||||
"execution_count": 42,
|
||||
"execution_count": 43,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
@@ -1275,7 +1308,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 43,
|
||||
"execution_count": 44,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -1283,35 +1316,35 @@
|
||||
" \"\"\"Print hand type probability statistics for each handmaker.\"\"\"\n",
|
||||
" samples = [estimated_type_frequency(h, n) for h in handmakers]\n",
|
||||
" def name(h): return h.__name__.split('_')[0]\n",
|
||||
" print(f'{\"Type of Hand\":15} {join(f\"{name(h):>7s}\" for h in handmakers)}')\n",
|
||||
" print(f'{\"-\"*15} {join(\"-\"*7 for h in handmakers)}')\n",
|
||||
" print(f'{\"Type of Hand\":15} {join(f\"{name(h):>8s}\" for h in handmakers)}')\n",
|
||||
" print(f'{\"-\"*15} {join(\"-\"*8 for h in handmakers)}')\n",
|
||||
" for t in reversed(type_names):\n",
|
||||
" print(f'{t:15} ', join(f'{s[t]/n:7.3%}' for s in samples))"
|
||||
" print(f'{t:15} ', join(f'{s[t]/n:8.4%}' for s in samples))"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 44,
|
||||
"execution_count": 45,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Type of Hand deal draw joker texas omaha threeD\n",
|
||||
"--------------- ------- ------- ------- ------- ------- -------\n",
|
||||
"five of a kind 0.000% 0.000% 0.003% 0.000% 0.000% 0.000%\n",
|
||||
"straight flush 0.002% 0.009% 0.010% 0.023% 0.095% 0.189%\n",
|
||||
"four of a kind 0.031% 0.077% 0.309% 0.160% 0.478% 1.558%\n",
|
||||
"full house 0.150% 0.694% 0.290% 2.551% 6.268% 9.729%\n",
|
||||
"flush 0.174% 0.786% 0.367% 3.169% 6.796% 7.679%\n",
|
||||
"straight 0.400% 1.314% 1.047% 4.615% 11.416% 18.565%\n",
|
||||
"three of a kind 1.935% 3.670% 7.294% 4.747% 8.743% 25.989%\n",
|
||||
"two pair 4.692% 9.980% 3.930% 23.456% 36.949% 28.106%\n",
|
||||
"one pair 42.378% 47.771% 45.501% 43.810% 26.305% 8.178%\n",
|
||||
"high card 50.238% 35.699% 41.249% 17.469% 2.950% 0.007%\n",
|
||||
"CPU times: user 5min 20s, sys: 1.91 s, total: 5min 22s\n",
|
||||
"Wall time: 5min 52s\n"
|
||||
"Type of Hand deal draw joker texas omaha threeD\n",
|
||||
"--------------- -------- -------- -------- -------- -------- --------\n",
|
||||
"five of a kind 0.0000% 0.0000% 0.0070% 0.0000% 0.0000% 0.0000%\n",
|
||||
"straight flush 0.0000% 0.0050% 0.0190% 0.0410% 0.0990% 0.1790%\n",
|
||||
"four of a kind 0.0300% 0.0600% 0.2840% 0.1930% 0.4540% 1.5450%\n",
|
||||
"full house 0.1490% 0.6540% 0.3300% 2.5750% 6.3800% 9.7730%\n",
|
||||
"flush 0.1970% 0.7830% 0.3230% 2.9890% 6.7390% 7.5840%\n",
|
||||
"straight 0.3980% 1.2720% 1.0650% 4.5740% 11.2920% 18.6330%\n",
|
||||
"three of a kind 2.1880% 3.7060% 7.4280% 4.8560% 8.8300% 25.9350%\n",
|
||||
"two pair 4.7220% 9.6350% 3.8690% 23.6260% 36.7720% 28.3140%\n",
|
||||
"one pair 42.1940% 48.0430% 45.5100% 43.8630% 26.4810% 8.0260%\n",
|
||||
"high card 50.1220% 35.8420% 41.1650% 17.2830% 2.9530% 0.0110%\n",
|
||||
"CPU times: user 4min 25s, sys: 161 ms, total: 4min 25s\n",
|
||||
"Wall time: 4min 25s\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
@@ -1334,26 +1367,26 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 45,
|
||||
"execution_count": 46,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"[0.0,\n",
|
||||
" 0.35699,\n",
|
||||
" 0.8347,\n",
|
||||
" 0.9345,\n",
|
||||
" 0.9712,\n",
|
||||
" 0.98434,\n",
|
||||
" 0.9922,\n",
|
||||
" 0.99914,\n",
|
||||
" 0.99991,\n",
|
||||
" 0.35842,\n",
|
||||
" 0.83885,\n",
|
||||
" 0.9352,\n",
|
||||
" 0.97226,\n",
|
||||
" 0.98498,\n",
|
||||
" 0.99281,\n",
|
||||
" 0.99935,\n",
|
||||
" 0.99995,\n",
|
||||
" 1.0,\n",
|
||||
" 1.0]"
|
||||
]
|
||||
},
|
||||
"execution_count": 45,
|
||||
"execution_count": 46,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
@@ -1373,7 +1406,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 46,
|
||||
"execution_count": 47,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
@@ -1382,13 +1415,13 @@
|
||||
"'4s'"
|
||||
]
|
||||
},
|
||||
"execution_count": 46,
|
||||
"execution_count": 47,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"hand = cards('6d 8c 4s Qc 7s')\n",
|
||||
"hand = cards('4s Qc 6d 7s 8c')\n",
|
||||
"\n",
|
||||
"draw_best_action(hand, P=deal_win_P)"
|
||||
]
|
||||
@@ -1404,7 +1437,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 47,
|
||||
"execution_count": 48,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
@@ -1413,7 +1446,7 @@
|
||||
"'Qc'"
|
||||
]
|
||||
},
|
||||
"execution_count": 47,
|
||||
"execution_count": 48,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
@@ -1426,32 +1459,32 @@
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"This is a risky play: we give up our high card, so our hand could get worse. But there's a 4/47 chance of greatly improving the hand by hitting the inside straight; the same 16/47 chance of getting a pair of some kind (but not a pair of queens), and a 11/47 chance of getting a hiugh card of queen or better. The difference in actions is because under `draw_win_P`, a queen high is much less likely to win, so it is worth sacrificing the queen for a chance at a straight.\n",
|
||||
"This is a risky play: we give up our high card, so our hand could get worse. But there's a 4/47 chance of greatly improving the hand by hitting the inside straight; the same 16/47 chance of getting a pair of some kind (but not a pair of queens), and a 11/47 chance of getting a high card of queen or better. The difference in actions is because under `draw_win_P`, a queen high is much less likely to win, so it is worth sacrificing the queen for a chance at a straight.\n",
|
||||
"\n",
|
||||
"Now I will define a new handmaker that uses these probabilities, and I will regenerate the stats chart (note that the `@lru_cache` dedcorator on `estimated_type_frequency` means that I won't have to wait another five minutes)."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 48,
|
||||
"execution_count": 49,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"Type of Hand draw2 deal draw joker texas omaha threeD\n",
|
||||
"--------------- ------- ------- ------- ------- ------- ------- -------\n",
|
||||
"five of a kind 0.000% 0.000% 0.000% 0.003% 0.000% 0.000% 0.000%\n",
|
||||
"straight flush 0.003% 0.002% 0.009% 0.010% 0.023% 0.095% 0.189%\n",
|
||||
"four of a kind 0.076% 0.031% 0.077% 0.309% 0.160% 0.478% 1.558%\n",
|
||||
"full house 0.696% 0.150% 0.694% 0.290% 2.551% 6.268% 9.729%\n",
|
||||
"flush 0.810% 0.174% 0.786% 0.367% 3.169% 6.796% 7.679%\n",
|
||||
"straight 1.404% 0.400% 1.314% 1.047% 4.615% 11.416% 18.565%\n",
|
||||
"three of a kind 3.723% 1.935% 3.670% 7.294% 4.747% 8.743% 25.989%\n",
|
||||
"two pair 9.533% 4.692% 9.980% 3.930% 23.456% 36.949% 28.106%\n",
|
||||
"one pair 47.700% 42.378% 47.771% 45.501% 43.810% 26.305% 8.178%\n",
|
||||
"high card 36.055% 50.238% 35.699% 41.249% 17.469% 2.950% 0.007%\n"
|
||||
"Type of Hand draw2 deal draw joker texas omaha threeD\n",
|
||||
"--------------- -------- -------- -------- -------- -------- -------- --------\n",
|
||||
"five of a kind 0.0000% 0.0000% 0.0000% 0.0070% 0.0000% 0.0000% 0.0000%\n",
|
||||
"straight flush 0.0050% 0.0000% 0.0050% 0.0190% 0.0410% 0.0990% 0.1790%\n",
|
||||
"four of a kind 0.0770% 0.0300% 0.0600% 0.2840% 0.1930% 0.4540% 1.5450%\n",
|
||||
"full house 0.7080% 0.1490% 0.6540% 0.3300% 2.5750% 6.3800% 9.7730%\n",
|
||||
"flush 0.7820% 0.1970% 0.7830% 0.3230% 2.9890% 6.7390% 7.5840%\n",
|
||||
"straight 1.3670% 0.3980% 1.2720% 1.0650% 4.5740% 11.2920% 18.6330%\n",
|
||||
"three of a kind 3.6240% 2.1880% 3.7060% 7.4280% 4.8560% 8.8300% 25.9350%\n",
|
||||
"two pair 9.5970% 4.7220% 9.6350% 3.8690% 23.6260% 36.7720% 28.3140%\n",
|
||||
"one pair 47.9090% 42.1940% 48.0430% 45.5100% 43.8630% 26.4810% 8.0260%\n",
|
||||
"high card 35.9310% 50.1220% 35.8420% 41.1650% 17.2830% 2.9530% 0.0110%\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
@@ -1467,13 +1500,13 @@
|
||||
"source": [
|
||||
"To be truly accurate, we should repeat this process of using updated probabilities until we hit a fixpoint. But we can see that there is not that much difference between the `draw` and the `draw2` columns, so I'm not going to bother with that.\n",
|
||||
"\n",
|
||||
"Below I compare the two win probabilities for the test hands, `deal_win_P` on the left and `draw_win_P` on the right:\n",
|
||||
"Below I compare the two win probabilities for the test hands, `deal_win_P` on the left and `draw_win_P` on the right. We can see that a three-of-a-kind or better is very likely to win under either condition, but that a pair of 2s, which has a 53% chance of winning on the deal, only has a 39% chance after the draw.\n",
|
||||
"\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 49,
|
||||
"execution_count": 50,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
@@ -1485,41 +1518,41 @@
|
||||
"3h 3s 3d 3c 3c 100.00000% 100.00000% five of a kind\n",
|
||||
"2s 2c 2d 2h 2h 100.00000% 100.00000% five of a kind\n",
|
||||
"As Ks Qs Ts Js 100.00000% 100.00000% straight flush\n",
|
||||
"Kc Qc Jc Tc 9c 99.99988% 99.99931% straight flush\n",
|
||||
"6d 5d 4d 3d 2d 99.99905% 99.99446% straight flush\n",
|
||||
"5h 4h 3h 2h Ah 99.99893% 99.99377% straight flush\n",
|
||||
"As Ac Ad Ah 2s 99.99846% 99.99100% four of a kind\n",
|
||||
"7s 7c 7d 2d 7h 99.98553% 99.94954% four of a kind\n",
|
||||
"6s 6c 6d 6h 9s 99.98369% 99.94362% four of a kind\n",
|
||||
"As 5h 5c 5d 5s 99.98184% 99.93769% four of a kind\n",
|
||||
"Th Tc Td 5h 5c 99.93013% 99.70046% full house\n",
|
||||
"9h 9c 9d 8c 8h 99.91904% 99.64708% full house\n",
|
||||
"6h 6c 6d Tc Th 99.88580% 99.48692% full house\n",
|
||||
"5c 5d 5s As Ah 99.87472% 99.43354% full house\n",
|
||||
"As 2s 3s 4s 6s 99.83039% 99.22000% flush\n",
|
||||
"Kc Qc Jc Tc 2c 99.81528% 99.15954% flush\n",
|
||||
"Qc Jc Tc 9c 7c 99.80016% 99.09908% flush\n",
|
||||
"4h 5h 6h 7h 9h 99.75480% 98.91769% flush\n",
|
||||
"As Kd Qc Td Jh 99.63385% 98.43400% straight\n",
|
||||
"Kc Qh Jd Th 9c 99.60366% 98.33292% straight\n",
|
||||
"6c 5d 4h 3s 2s 99.39234% 97.62538% straight\n",
|
||||
"As 2d 3c 4h 5s 99.36215% 97.52431% straight\n",
|
||||
"As Ac Ad 2h 3h 99.24139% 97.12000% three of a kind\n",
|
||||
"Ts Tc Th 9s 8c 98.59128% 95.99077% three of a kind\n",
|
||||
"Ts Tc Th 9s 7c 98.59128% 95.99077% three of a kind\n",
|
||||
"9h 9s 9d Ah Kh 98.42876% 95.70846% three of a kind\n",
|
||||
"Ts Tc 5s 5c 8h 95.66580% 90.37923% two pair\n",
|
||||
"Ts Tc 5s 5c 7h 95.66580% 90.37923% two pair\n",
|
||||
"9s 9c 8s 8c As 95.30012% 89.61154% two pair\n",
|
||||
"3s 3c 2s 2d Ah 93.10601% 85.00538% two pair\n",
|
||||
"As Ac 4c 5s 6s 92.37464% 83.47000% one pair\n",
|
||||
"4s 4c As Ks Qs 59.86933% 46.72308% one pair\n",
|
||||
"4h 4d Kh Qd Jd 59.86933% 46.72308% one pair\n",
|
||||
"2d 2c Ad Kd Qd 53.36827% 39.37369% one pair\n",
|
||||
"Ah 3s 4s 5s 6s 50.11774% 35.69900% high card\n",
|
||||
"Kh Qh Jh Th 8d 46.26253% 32.95292% high card\n",
|
||||
"7d 2s 4s 5s 6s 23.13126% 16.47646% high card\n",
|
||||
"7h 6s 5d 3s 2d 23.13126% 16.47646% high card\n"
|
||||
"Kc Qc Jc Tc 9c 99.99988% 99.99962% straight flush\n",
|
||||
"6d 5d 4d 3d 2d 99.99905% 99.99692% straight flush\n",
|
||||
"5h 4h 3h 2h Ah 99.99893% 99.99654% straight flush\n",
|
||||
"As Ac Ad Ah 2s 99.99846% 99.99500% four of a kind\n",
|
||||
"7s 7c 7d 2d 7h 99.98553% 99.96269% four of a kind\n",
|
||||
"6s 6c 6d 6h 9s 99.98369% 99.95808% four of a kind\n",
|
||||
"As 5h 5c 5d 5s 99.98184% 99.95346% four of a kind\n",
|
||||
"Th Tc Td 5h 5c 99.93013% 99.73377% full house\n",
|
||||
"9h 9c 9d 8c 8h 99.91904% 99.68346% full house\n",
|
||||
"6h 6c 6d Tc Th 99.88580% 99.53254% full house\n",
|
||||
"5c 5d 5s As Ah 99.87472% 99.48223% full house\n",
|
||||
"As 2s 3s 4s 6s 99.83039% 99.28100% flush\n",
|
||||
"Kc Qc Jc Tc 2c 99.81528% 99.22077% flush\n",
|
||||
"Qc Jc Tc 9c 7c 99.80016% 99.16054% flush\n",
|
||||
"4h 5h 6h 7h 9h 99.75480% 98.97985% flush\n",
|
||||
"As Kd Qc Td Jh 99.63385% 98.49800% straight\n",
|
||||
"Kc Qh Jd Th 9c 99.60366% 98.40015% straight\n",
|
||||
"6c 5d 4h 3s 2s 99.39234% 97.71523% straight\n",
|
||||
"As 2d 3c 4h 5s 99.36215% 97.61738% straight\n",
|
||||
"As Ac Ad 2h 3h 99.24139% 97.22600% three of a kind\n",
|
||||
"Ts Tc Th 9s 8c 98.59128% 96.08569% three of a kind\n",
|
||||
"Ts Tc Th 9s 7c 98.59128% 96.08569% three of a kind\n",
|
||||
"9h 9s 9d Ah Kh 98.42876% 95.80062% three of a kind\n",
|
||||
"Ts Tc 5s 5c 8h 95.66580% 90.55538% two pair\n",
|
||||
"Ts Tc 5s 5c 7h 95.66580% 90.55538% two pair\n",
|
||||
"9s 9c 8s 8c As 95.30012% 89.81423% two pair\n",
|
||||
"3s 3c 2s 2d Ah 93.10601% 85.36731% two pair\n",
|
||||
"As Ac 4c 5s 6s 92.37464% 83.88500% one pair\n",
|
||||
"4s 4c As Ks Qs 59.86933% 46.92885% one pair\n",
|
||||
"4h 4d Kh Qd Jd 59.86933% 46.92885% one pair\n",
|
||||
"2d 2c Ad Kd Qd 53.36827% 39.53762% one pair\n",
|
||||
"Ah 3s 4s 5s 6s 50.11774% 35.84200% high card\n",
|
||||
"Kh Qh Jh Th 8d 46.26253% 33.08492% high card\n",
|
||||
"7d 2s 4s 5s 6s 23.13126% 16.54246% high card\n",
|
||||
"7h 6s 5d 3s 2d 23.13126% 16.54246% high card\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
@@ -1542,7 +1575,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 50,
|
||||
"execution_count": 51,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -1567,26 +1600,6 @@
|
||||
"straights = [set(range(start, start + 5)) for start in range(2, 11)] + [{14, 2, 3, 4, 5}]"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 51,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"'flush'"
|
||||
]
|
||||
},
|
||||
"execution_count": 51,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"flush_or_straight_first()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 52,
|
||||
@@ -1615,7 +1628,7 @@
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"Counter({'straight': 3961, 'flush': 5066, 'straightflush': 973})"
|
||||
"'flush'"
|
||||
]
|
||||
},
|
||||
"execution_count": 53,
|
||||
@@ -1623,6 +1636,26 @@
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"flush_or_straight_first()"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 54,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"Counter({'flush': 5191, 'straight': 3809, 'straightflush': 1000})"
|
||||
]
|
||||
},
|
||||
"execution_count": 54,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
],
|
||||
"source": [
|
||||
"Counter(flush_or_straight_first() for _ in range(10**4))"
|
||||
]
|
||||
@@ -1632,14 +1665,14 @@
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"We know that a straight is a more probable hand than a flush in general, but\n",
|
||||
"counterintuitively, a flush is more likely to come up first, by about 50% to 40%, with about 10% of the time both of them coming up on the same card (a straight flush). One explanation for this is the [pigeonhole principle](https://en.wikipedia.org/wiki/Pigeonhole_principle): there are only four suits (pigeonholes), each of which can only fit four cards (pigeons) before we get a flush. So that means, in the worst case, the first 16 cards fill all the holes, and the 17th card **must** make a flush. But for a straight, it is possible to go 20 or 30 or even 40 cards without making any straight (e.g.: 2-3-4-5, 7-8-9-T, and Q-K of each suit is 40 cards with no straight).\n",
|
||||
"counterintuitively, a flush is more likely to come up first, by about 50% to 40%, with about 10% of the time both of them coming up on the same card (a straight flush). One explanation for this is the [pigeonhole principle](https://en.wikipedia.org/wiki/Pigeonhole_principle): there are only four suits (pigeonholes), each of which can only fit four cards (pigeons) before we get a flush. So that means, in the worst case, the first 16 cards fill all the holes, and the 17th card **must** make a flush. But for a straight, it is possible to go up to 44 cards without making any straight (every straight must contain either a 5 or a 10; so you could deal the other 11 ranks in all four suits and not have a straight).\n",
|
||||
" \n",
|
||||
"We can extend Bram's experiment to all the types. The function `what_first` simulates a single pass through the deck, flipping up cards until every type has appeared, and returning as a result a dict of `{type_number: number_of_cards_to_make_that_type}`. We'll leave out type 0, \"high card\", because the very first card always makes a high card."
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 54,
|
||||
"execution_count": 55,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -1682,16 +1715,16 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 55,
|
||||
"execution_count": 56,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"{1: 3, 2: 6, 5: 11, 6: 16, 3: 16, 7: 24, 8: 26, 4: 26}"
|
||||
"{1: 7, 2: 9, 6: 11, 3: 11, 4: 12, 5: 15, 7: 23, 8: 30}"
|
||||
]
|
||||
},
|
||||
"execution_count": 55,
|
||||
"execution_count": 56,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
@@ -1709,7 +1742,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 56,
|
||||
"execution_count": 57,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -1726,25 +1759,25 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 57,
|
||||
"execution_count": 58,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"text/plain": [
|
||||
"{0: Counter(),\n",
|
||||
" 1: Counter({6: 3, 4: 2, 9: 2, 3: 1, 5: 1, 2: 1}),\n",
|
||||
" 2: Counter({7: 1, 11: 1, 10: 3, 12: 1, 9: 2, 4: 1, 8: 1}),\n",
|
||||
" 3: Counter({10: 1, 17: 1, 20: 2, 15: 2, 11: 1, 13: 1, 12: 2}),\n",
|
||||
" 4: Counter({8: 4, 13: 1, 9: 1, 16: 2, 11: 1, 12: 1}),\n",
|
||||
" 5: Counter({12: 3, 11: 1, 10: 1, 13: 3, 8: 1, 17: 1}),\n",
|
||||
" 6: Counter({10: 1, 17: 1, 20: 2, 15: 2, 11: 1, 13: 1, 12: 2}),\n",
|
||||
" 7: Counter({18: 2, 31: 1, 29: 1, 23: 1, 26: 2, 19: 1, 28: 1, 24: 1}),\n",
|
||||
" 8: Counter({21: 2, 29: 1, 18: 1, 24: 2, 31: 1, 30: 1, 28: 1, 26: 1}),\n",
|
||||
" 1: Counter({5: 1, 8: 1, 10: 1, 9: 2, 6: 2, 2: 1, 7: 1, 3: 1}),\n",
|
||||
" 2: Counter({10: 4, 11: 2, 7: 1, 8: 2, 4: 1}),\n",
|
||||
" 3: Counter({13: 1, 15: 3, 11: 1, 14: 3, 17: 1, 9: 1}),\n",
|
||||
" 4: Counter({9: 2, 14: 1, 17: 2, 13: 1, 19: 1, 10: 2, 16: 1}),\n",
|
||||
" 5: Counter({12: 2, 9: 1, 8: 1, 13: 1, 10: 1, 11: 3, 16: 1}),\n",
|
||||
" 6: Counter({13: 1, 15: 3, 11: 1, 14: 3, 17: 1, 9: 1}),\n",
|
||||
" 7: Counter({31: 2, 25: 1, 34: 1, 12: 1, 21: 1, 20: 1, 19: 1, 26: 1, 27: 1}),\n",
|
||||
" 8: Counter({22: 1, 14: 1, 20: 2, 36: 1, 28: 1, 33: 1, 23: 1, 25: 1, 34: 1}),\n",
|
||||
" 9: Counter()}"
|
||||
]
|
||||
},
|
||||
"execution_count": 57,
|
||||
"execution_count": 58,
|
||||
"metadata": {},
|
||||
"output_type": "execute_result"
|
||||
}
|
||||
@@ -1764,15 +1797,15 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 58,
|
||||
"execution_count": 59,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"name": "stdout",
|
||||
"output_type": "stream",
|
||||
"text": [
|
||||
"CPU times: user 46.7 s, sys: 264 ms, total: 47 s\n",
|
||||
"Wall time: 50.3 s\n"
|
||||
"CPU times: user 36.2 s, sys: 12.8 ms, total: 36.3 s\n",
|
||||
"Wall time: 36.3 s\n"
|
||||
]
|
||||
}
|
||||
],
|
||||
@@ -1789,7 +1822,7 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 59,
|
||||
"execution_count": 60,
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
@@ -1815,12 +1848,12 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 60,
|
||||
"execution_count": 61,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAmcAAAFzCAYAAAB7Ha4BAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nOydeXxTVfr/3zfpXgotS6Fstmy2dKWtFEWBsg6CKIiDyldkxB1mRvxZcTZgHBxxyrgNCjouuLANKopKFZVVRGkLBUFk60KB0tKW7k2znd8fITFt0zRtc9O03vfrlVeam3ufz3nuc8/tybnnPEcSQqCgoKCgoKCgoOAeqNq7AAoKCgoKCgoKCr+gNM4UFBQUFBQUFNwIpXGmoKCgoKCgoOBGKI0zBQUFBQUFBQU3QmmcKSgoKCgoKCi4EUrjTEFBQUFBQUHBjfBo7wI4k549e4rQ0NAWHVNdXY2/v788BVJwK5RY/7pQ4v3rQon3r4fOFOvMzMxiIUSvhts7VeMsNDSUjIyMFh2ze/duxo0bJ0+BgKKiIoKDg2Wzr2g4jtyxhs5xnlyh4QoflHi7h31XaSj38l+PRmeq2717986z9Z3yWFNmgoKCFA030pCbznKe5NboDLEGJRbupCE3neU8dRYNuWnv89QpGmeSJN0iSdLrpaWl1NTUUFlZSUVFBbW1tZSWlqLT6SgqKkIIQUFBAQAXL14EQKfTIYSgqKgInU5HaWkptbW1VFRUUFlZSU1NDWVlZWi1WoqLizEajVy6dKmeDfN7YWEher2ekpISNBoN5eXlFBUVUV1dTXl5ORqNhpKSEvR6PYWFhTZtXLp0CaPRSHFxMVqtlrKysmZ9ysnJqWejoKDA6T6dP3/e4lN1dbUsPl25cqXJODnDJ51O12ScnOVTYWGhw9dea32qrKx06Npri0+lpaUOXXut9am0tLRV9Umua6+1PhUWFrb5HtGcTw3rt7N9unLlitPvew19On/+vOxxUu7lyr28I97Lm0LqTMs3JSYmCnd7rFlbW4uvr69s9hUNx3FFV3hnOE+u0HCFD0q83cO+qzSUe/mvR6Mz1W0/P79MIURiw+861Zgzd0Sn08keYEXDfegs50lujc4Qa1Bi4U4azembe4xai9FoRKWS92GTouEY3bp148SJE7LZB+f74OPjQ//+/fH09LRsM/cA2kJpnMmMJEmKhhtpyE1nOU9ya3SGWIMSC3fSsMf58+cJCAggNDS01WUxGAyo1Wonl0zRaA2VlZUEBATIZh+c64MQgpKSEs6fP09YWJhlu71rsVOMOXNn5K4EioZ70VnOk9wanSHWoMTCnTTsodFo6NGjR7s3EhV+nUiSRI8ePRr13NqrF0rjTGa0Wq2i4UYactNZzpPcGp0h1qDEwp00mqOtDTNXjM9WNNwHZ/tg6/qzVy+UxpnM+Pn5KRpupCE3neU8ya3RGWINSizcSUNu2jr+6IUXXiAyMpKoqCjuuusum+PfnDXGKSUlhfDwcGJiYpg5cyZlZWUA5ObmEhAQQFxcHHFxcTz88MM2jz9y5AjXX3890dHR3HLLLVRUVDis/c9//rNVftx///389NNPdveZP38+H3zwQaPtubm5bNiwocnjUlJSiIyMJCUlheXLl7Nq1apmy9PQh9zcXKKiopo9riXYqxdK40xmWnJRKxrya8hNZzlPcmt0hliDEgt30nAqF9Pgm/HwSZjp/WIaBoOh1eYuXLjAyy+/TEZGBseOHcNgMLBp06ZG+7VFw5pJkyZx7Ngxjh49yrBhw3j22Wct3w0aNIisrCyysrJYu3atzePvv/9+Vq5cyY8//sjMmTNJTU11WPuf//ynTT+EEBiNxiaPe+ONNxg+fLjDOtY01zh77bXXOHToUIv8cFYs7GGvXiiNM5np3r27ouFkjbTTaYx/ZzxhL4Ux/p3xpJ1Ok7lkjuNO58mdNVzhgytQYuE+Gk7jYhqkL4LaAvDqbnpPX4RH0VdtMqvX66mtrUWv11NTU0Pfvn0b7ePh8cscvYY9PFFRUeTm5jqkNXnyZIutUaNGcf78ect3jjzePXnyJGPGjAFMDb0PP/yw0T4FBQWMGTOGuLg4oqKi2LdvH0899RS1tbVcd911zJ07l9zcXCIiInj00UeJj48nPz+fRx55hMTERCIjI1m2bJnF3rhx4ywr/Lz55psMGzaMcePG8cADD7Bo0SLLfnv37mXixIkMGjTI0ov21FNPsW/fPuLi4njhhRfqlXPGjBlUV1eTlJTE5s2b631nrVlcXIx5+cfjx48zevRo4uLiiImJ4fTp04CpwfbAAw8QGRnJ5MmTqa2tbfZc2sNevegUjTN3TkJ77tw52RMX/vzzz/VsyJG48OzZs7InLrx48WKzSf42Zmxk4faFnC8/T6BXIBfKL/Do54/y8bGP3SJxYV5enuyJC4uKimRP2HrhwgVZk9BeuHChUyShzcvLkz0JbcP67WyfLl68KHsS2rNnz7ZrElqj0YjBYECv12M0GjGmJSC+SLTcE7RaLWQuxpiWAEf+glHlifDwR2jLENXnELoKjD/9y2SjqgCRlohx5xSEEPVtWL2by6PT6QgJCWHx4sUMHDiQkJAQunbtysSJE9Hr9fztb3/jo48+QghhedRptqHX6+tpmMt/4403Wh5NxsbGWt6/+uqrRuV54403mDp1qqU8OTk5jBgxgjFjxrB79+5658WsFxkZybZt29BqtWzZsoX8/PxGPq1fv55JkyaRmZnJoUOHiI6O5p///Ce+vr4cPHiQdevWIYTg5MmTzJs3jx9++IFrrrmGZcuWkZ6eTmZmJnv27OHQoUMYjUaEEBgMBvLz8/nHP/7Bd999x/bt2/n5558tPW5Go5GCggK+/PJLPvvsM5566imEEDzzzDPceOONZGRk8Ic//KGeTx999BG+vr6kp6czZ84cS4+YvXO8Zs0aHn30UTIzMzl48CB9+vTBaDRy+vRpHn30UQ4fPkxgYKClsafVai02zOfRfM2ZX2adhvfyJhFCdJpXQkKCaCm7du1q8TEK7UfyumQR/p9wMfTloSJidYRIeC1BhP8nXCSvS272WCXWvy6UeP+6sBfvn376qf6GtATTy5qMx0zbPuwjxPZ409+fDBZik58QH4YI8XGYab/aItN3O6c4XLbS0lKRnJwsioqKhFarFbfeeqt477337B6zbNkykZqaavkcGRkpcnJyHNYUQogVK1aI2267TRiNRiGEEBqNRhQXF5vczcgQ/fv3F+Xl5Y2OO3HihJg0aZKIj48Xy5cvF927d2+0z549e8TgwYPFsmXLxOHDhy3b/f39LX/n5OSI0NDQesetWbNGjBgxQkRHR4uePXuKjRs3CiGEGDt2rEhPTxdbt24V8+bNs+z/0ksviYULFwohhLj33nvF+++/LyoqKoQQQnTp0kUIYYr9tGnTmjwP1mWyPq9mTSGEuHz5srjmmmuEEEKsX79eDB8+XKxcuVKcOnXK4suQIUMsdlauXCn+8Y9/NKlpi0bXoRACyBA22jOdoufMnTH/qlM0nKORU5aDSlJxofIC+RX5GIURP08/cstyZS+fI7jLeXJ3DVf44AqUWLiPRov4TYbpZU3CC6Zt3SLAUGPa5hVo+uzVDaPfQNM2n16m/ZK/cFju66+/JiwsjF69euHp6cmsWbP47rvvGu3XcPaesJoxaJ2w9KabbrL0nFm/vv76a8s+77zzDp999hnr16+3PMr09va25AdLSEhg8ODBnDp1qlE5wsPD2bFjB5mZmdx1110MHjy40T5jxoxh79699OvXj3vuuYd3333Xph/+/v6Wv3Nycli1ahXffPMNR48eZdq0aY0mRlj7bAtvb2+H920ODw8PS6+cdTnuvvtuPvjgA3x9fZkyZQo7d+5spK1Wq9Hr9W3St1cvlCS0MmNrXIGi0XqNsMAwCioLUEtq/Dz9kJCo0dUQGhgqe/kcwV3Ok7truMIHV6DEwn00nEZEimnMGYDaz9RQM2hRRS5ptcmBAwfy/fffU1NTg6+vL9988w2JiY1W7MHLy6ve5/T0dADy8vLIzc21PJLbt2+fXb0vvviC5557jj179tSbEXj58mXLOKfs7GxOnz7NoEGDGh1fVFREcHAwRqORFStW2JzVmZeXR79+/XjggQeorq7m0KFDzJs3D09PzybHtVVUVODv70+3bt0oLCwkLS2t0TJMI0eOZPHixVy5coWAgAA+/PBDoqOj7fobEBBgd53KpggNDSUzM5ORI0fWmwWanZ1NeHg4ERERZGdnc/ToUZvnqa3Yqxey9ZxJkvSWJElFkiQds9q2WZKkrKuvXEmSspo4NleSpB+v7teyxTLdjM7yq9QdNHQGHSk3pKA1aukX0I9+Af2o0dWgNWpJuSFF9vI5gjucp46g4XY9Ka1EiYX7aDiNvlPhutXgGwLaK6b361aj7Tmh1SaTkpKYPXs28fHxREdHYzQaefDBBwFYunQp27ZtAxr3nF25coXrrruO++67j1mzZrFkiWMNxEWLFlFZWcmkSZPqpczYu3cv0dHRxMbGMnv2bNauXWtprN1///2WwfEbN25k2LBhhIeH07dvX373u9810ti9ezdxcXGMGDGCDz/8kD/+8Y8APPjgg0RHRzN37txGx8TGxjJixAgiIyO57777GD16dKN9+vXrx5///GeSkpKYOHEiw4cPp1u3bnb9jYmJwcPDg9jY2EYTAuzxxBNPsGbNGm644QaKi4st2zdv3kxkZCRxcXH8/PPPzJs3z2GbLcFevZBt4XNJksYAVcC7QohGyUEkSfo3UC6EeNrGd7lAohCiuOF39nDHhc8VnMPX2V/zavqrrL55NUcuHSH1u1Ryy3IJDQwl5YYUpg6d2qwNJda/LpR4/7qwF+8TJ04QERHh2gK1keXLl9OlSxeeeOKJ9i6Ky6mqqqJLly7o9XpmzpzJfffdx8yZMy3fu2L5JjmwdR1Line truncated
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<Figure size 720x432 with 1 Axes>"
|
||||
]
|
||||
@@ -1844,12 +1877,12 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 61,
|
||||
"execution_count": 62,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<Figure size 720x432 with 1 Axes>"
|
||||
]
|
||||
@@ -1875,12 +1908,12 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 62,
|
||||
"execution_count": 63,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<Figure size 720x432 with 1 Axes>"
|
||||
]
|
||||
@@ -1904,12 +1937,12 @@
|
||||
},
|
||||
{
|
||||
"cell_type": "code",
|
||||
"execution_count": 63,
|
||||
"execution_count": 64,
|
||||
"metadata": {},
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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a9YsUVpaKm699VaRlZUlpk6dKu6//353ffPnzxdffvmlEEKIl156SRx//PHiBz/4gbjpppvEkiVLhBBCXHvtteLnP/+5mDdvnsjIyBBvvvmmEEKIuXPnioSEBDFz5kzxxBNPdGvn+eef727TunXruvl1/vz54osvvhBCCFFbWyvGjx8vhBDiv//9rzjppJPEzJkzxfTp08WBAwfcttx0001i6tSp4qyzzhJms9mj/3peb3a7XQBFwsN4RhUzV2qmpqZG11CRhmy04ifZGlqINRxjsagohC+XQnslRCU5f3651Hk8UBqh5oNs56crO+6CD7IRu38DxiiIiAVrE7QdAlsz7CtwluuodZ67+Vy/5caMGcOyZcsYN24cqampxMfHc/bZZwNw//33s2HDhn41//TTT3c/2uv6+eSTT9xlbDYbAH/+85/Jy8tzHy8pKWH27NnMnz+ff/3rXx7rP/HEE91tevPNNzl8+HCvMn/7298488wz2bVrF7t372bWrFmsWLGCoUOHsmvXLtasWQPAN998wzXXXMNXX33F+PHjWb58OUVFRezZs4etW7eyZ8+ebvVWVFTw8MMPs23bNtavX8/+/fu7fV9ZWcm///1v/vGPf3DvvfcCsGLFCk4//XR27drFXXfd1a38hg0b3G267LLLetnhmtXsyurVq7njjjvYtWsXRUVFjB07FoBvv/2WJUuW8L///Y9hw4bx9ttve/RfT7zdF3oqBh+MHj1a11CRhmy04ifZGlqINRxjsdhXAIZIsHeC4eggw3U8Lc/rqVqIt6GjCoamdT+oREJr6YDrbGhoYP369ZSUlDBs2DAuvfRSXn/9da666ioeeuihftfX16CoK5GRkSxfvpyIiAiuvPJKAFJTUzl06BAjRoxgx44dXHjhhfzvf/8jISGh27l//vOfuf3223nooYdYtGgRUVFRveo/6aSTuOGGG3A4HFx44YXMmjXLYzvGjx/PKaec4v7773//Oy+88AI2m43Kykr27t3LjBkz3N9/8cUXzJ8/n6SkJFpaWrj00ks5cOCA+/sLL7wQg8HA1KlT3Y+fB0NERO/hzbx581i+fDnl5eVcfPHF7seVGRkZbjuzsrIoLS31S8PbfaHPXPnAtR5A11CHhmy04ifZGlqINRxjsWj5DjpqnLM2ytF/eIwxfg0uwibe5xY5P13JehLOLcIRfwLYzc5jUcMgcQpEJUJcuvPYkBTnuTkf+C33ySefkJGRQUpKCpGRkSxatIj//Oc/Ps8TXd5k65qI0p+Zq5dffpl//OMfrFmzxv0GW3R0NCNGjHCam5XFxIkTuw1cXGRmZvLRRx+xY8cOLr/8ciZOnNirzBlnnMEnn3zCmDFjuPrqq3n11Vc92hAbG+v+vaSkhD/84Q98+umn7Nmzh/POO6/Xwv6uNnsiOjra77K+iIiIcO/z2LUdV1xxhXvG65xzzmHTpk29tI1Go3t20Bfe7gt9cOWDtLQ034V0jaBpyEYrfpKtoYVYwzEWi9jxIGygGICj/3jZzRCbHjgNFWOYdg/YLWBrAyGcP+0WmJI/4DrHjRvHtm3bMJvNCCHYunUrU6ZM8Xnel19+CUBZWRmlpaXuR1j/+te/2LVrV6/PmWeeCcAHH3zAypUr2bBhQ7c31Wpra911FBcX8+233zJhwoReuq7HWA6Hg0ceecTjW4VlZWWMHTuWm2++mRtvvJGdO3cCzhmzvjKSNzc3ExsbS2JiItXV1RQW9n7UfPLJJ7N161YaGhqw2Wx+PXqLj4+npaXFZ7mepKenux9Ldn0Lsbi4mAkTJnD77bezaNGiXo8u+4u3+0IfXPlAC/+z1ZKGbLTiJ9XMlqicYyoW037lXGsVORxQnIOLjlqITgG79/QBWoi3JXkhnLQKhqaCpcH586RVPh+JemPu3LlccsklzJkzh+nTp2Oz2bjlllsA72uuGhoa3I/fLr74Yu655x6/9JYuXUpLSwtnnXVWt5QLn332GTNmzGDmzJlccsklrF692r1p8U033URRkXM2b+3atUyePJnMzEzS0tK4/vrre2ls2bKFmTNnMnv2bN5++23uuOMOAG655RZmzJjhfhTZFVf5adOmccMNN3Daaaf1KjNmzBh+/etfM3fuXBYtWsTUqVNJTEz0au+MGTOIiIhg5syZPPnkk375CGDZsmU8++yznHrqqdTV1bmPv/HGG5x44onMmjWL/fv3c8011/hdpye83RfKYKffAkl2drZwXQT+EozdtXXUgR7rYws93gGgvRpM22HsIuffFYXONVatpRCTBp2NEBkLc1+CYdND2tSBxHvfvn1+zRSpiQceeIC4uDiWLVsW6qYEndbWVuLi4mhoaOCaa67hhhtu4KKLLgp1s/zG0/WmKMoOIUR2z7KqmLlSc56rsrIy6Xl5XBtYysxzdfDgQem5ho4cORL2ea5KS0ul57mqrq6WnhOqvLxcap6r8vJyTeS5Ki0tlZ7nquf9HWibjhw54jlOpioc227Cuut+HEc+cNqUlkfFlNfhgmIqpv0dFmyg4bg7scVN8WrTwYMHwz7PVWdnZ7ccTK68RYPJc9Uzf1J7e3uLine truncated
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<Figure size 720x432 with 1 Axes>"
|
||||
]
|
||||
|
||||
Reference in new issue
Block a user