From 09aca8cb5aa29c579ca1a8ce204ffa3d2b300fab Mon Sep 17 00:00:00 2001 From: "exercism-solutions-syncer[bot]" <211797793+exercism-solutions-syncer[bot]@users.noreply.github.com> Date: Thu, 30 Apr 2026 06:05:56 +0000 Subject: [PATCH] [Sync Iteration] python/black-jack/1 --- solutions/python/black-jack/1/black_jack.py | 104 ++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 solutions/python/black-jack/1/black_jack.py diff --git a/solutions/python/black-jack/1/black_jack.py b/solutions/python/black-jack/1/black_jack.py new file mode 100644 index 0000000..78c5409 --- /dev/null +++ b/solutions/python/black-jack/1/black_jack.py @@ -0,0 +1,104 @@ +"""Functions to help play and score a game of blackjack. + +How to play blackjack: https://bicyclecards.com/how-to-play/blackjack/ +"Standard" playing cards: https://en.wikipedia.org/wiki/Standard_52-card_deck +""" + + +def value_of_card(card): + """Determine the scoring value of a card. + + :param card: str - given card. + :return: int - value of a given card. See below for values. + + 1. 'J', 'Q', or 'K' (otherwise known as "face cards") = 10 + 2. 'A' (ace card) = 1 + 3. '2' - '10' = numerical value. + """ + + if card in ["J", "Q", "K"]: + return 10 + elif card == "A": + return 1 + else: + return int(card) + + +def higher_card(card_one, card_two): + """Determine which card has a higher value in the hand. + + :param card_one, card_two: str - cards dealt in hand. See below for values. + :return: str or tuple - resulting Tuple contains both cards if they are of equal value. + + 1. 'J', 'Q', or 'K' (otherwise known as "face cards") = 10 + 2. 'A' (ace card) = 1 + 3. '2' - '10' = numerical value. + """ + + v1 = value_of_card(card_one) + v2 = value_of_card(card_two) + + if v1 > v2: + return card_one + elif v2 > v1: + return card_two + else: + return card_one, card_two + + +def value_of_ace(card_one, card_two): + """Calculate the most advantageous value for an upcoming ace card. + + :param card_one, card_two: str - card dealt. See below for values. + :return: int - either 1 or 11 value of the upcoming ace card. + + 1. 'J', 'Q', or 'K' (otherwise known as "face cards") = 10 + 2. 'A' (ace card) = 11 (if already in hand) + 3. '2' - '10' = numerical value. + """ + + if card_one == "A" or card_two == "A": + return 1 + total = value_of_card(card_one) + value_of_card(card_two) + if total + 11 <= 21: + return 11 + return 1 + + +def is_blackjack(card_one, card_two): + """Determine if the hand is a 'natural' or 'blackjack'. + + :param card_one, card_two: str - card dealt. See below for values. + :return: bool - is the hand is a blackjack (two cards worth 21). + + 1. 'J', 'Q', or 'K' (otherwise known as "face cards") = 10 + 2. 'A' (ace card) = 11 (if already in hand) + 3. '2' - '10' = numerical value. + """ + + ten_cards = ["10", "J", "Q", "K"] + + # Check for Ace + ten-card in either order + return (card_one == "A" and card_two in ten_cards) or \ + (card_two == "A" and card_one in ten_cards) + + +def can_split_pairs(card_one, card_two): + """Determine if a player can split their hand into two hands. + + :param card_one, card_two: str - cards dealt. + :return: bool - can the hand be split into two pairs? (i.e. cards are of the same value). + """ + + return value_of_card(card_one) == value_of_card(card_two) + + +def can_double_down(card_one, card_two): + """Determine if a blackjack player can place a double down bet. + + :param card_one, card_two: str - first and second cards in hand. + :return: bool - can the hand can be doubled down? (i.e. totals 9, 10 or 11 points). + """ + + total = value_of_card(card_one) + value_of_card(card_two) + return total in [9, 10, 11]