Skip to content

Instantly share code, notes, and snippets.

@is3ka1
Created December 16, 2023 16:55
Show Gist options
  • Select an option

  • Save is3ka1/f0f8656796a4087aa9dce03e906482b7 to your computer and use it in GitHub Desktop.

Select an option

Save is3ka1/f0f8656796a4087aa9dce03e906482b7 to your computer and use it in GitHub Desktop.

Revisions

  1. is3ka1 revised this gist Dec 16, 2023. No changes.
  2. is3ka1 created this gist Dec 16, 2023.
    73 changes: 73 additions & 0 deletions shoot_the_dragons_gate.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,73 @@
    #!/usr/bin/env python3

    import matplotlib.pyplot as plt
    import seaborn as sns
    import numpy as np


    def calculate_probabilities(card1, card2, num_decks=1):
    deck = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13] * int(4 * num_decks)

    deck.remove(card1)
    deck.remove(card2)

    is_pair = card1 == card2

    if is_pair:
    higher_cards = [card for card in deck if card > card1]
    lower_cards = [card for card in deck if card < card1]
    collision_cards = [card for card in deck if card == card1]

    higher_prob = len(higher_cards) / len(deck)
    lower_prob = len(lower_cards) / len(deck)
    collision_prob = len(collision_cards) / len(deck)
    print('higher_prob: ', higher_prob)
    print('lower_prob: ', lower_prob)
    print('collision_prob: ', collision_prob)

    higher_expected_value = higher_prob * 1 - collision_prob * 3 - lower_prob * 1
    lower_expected_value = lower_prob * 1 - collision_prob * 3 - higher_prob * 1

    return {'higher': (higher_prob, higher_expected_value), 'lower': (lower_prob, lower_expected_value)}

    else:
    lower = min(card1, card2)
    upper = max(card1, card2)
    winning_cards = [card for card in deck if lower < card < upper]
    collision_cards = [card for card in deck if card == lower or card == upper]

    win_probability = len(winning_cards) / len(deck)
    collision_probability = len(collision_cards) / len(deck)
    print('win_probability: ', win_probability)
    print('collision_probability: ', collision_probability)

    expected_value = win_probability * 1 - collision_probability * 2 - (1 - win_probability - collision_probability) * 1
    return {'between': (win_probability, expected_value)}

    def choose_best_strategy_probabilities(card1, card2, num_decks=1):
    probabilities = calculate_probabilities(card1, card2, num_decks)
    print('probabilities: ', probabilities)
    if 'between' in probabilities:
    return probabilities['between']
    elif probabilities['higher'][1] > probabilities['lower'][1]:
    return probabilities['higher']
    else:
    return probabilities['lower']

    def plot_probabilities_with_hotmap(num_decks=1):
    expectations = np.zeros((13, 13))
    for i in range(13):
    for j in range(13):
    probabilities = choose_best_strategy_probabilities(i + 1, j + 1, num_decks)
    expectations[i, j] = probabilities[1]

    plt.figure(figsize=(10, 10))

    # flip the expectations matrix by y-axis to align with the card values
    expectations = np.flipud(expectations)
    ax = sns.heatmap(expectations, annot=True, fmt='.2f', cmap='coolwarm', center=0,
    xticklabels=['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K'],
    yticklabels=['K', 'Q', 'J', '10', '9', '8', '7', '6', '5', '4', '3', '2', 'A'],
    )
    ax.set(xlabel='Card 1', ylabel='Card 2', title=f'Expectation Values Distribution for Dragon Gate Game with {num_decks} Deck{"s" if num_decks > 1 else ""}')
    plt.show()