Skip to content

Commit 73f365f

Browse files
committed
add-poker-kata-with-one-started-branch
1 parent 55fcb50 commit 73f365f

7 files changed

Lines changed: 107 additions & 0 deletions

File tree

src/poker/__init__.py

Whitespace-only changes.

src/poker/readme.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# Texas Holdem
2+
3+
https://codingdojo.org/kata/TexasHoldEm/
4+

src/poker/with_read_input/__init__.py

Whitespace-only changes.

src/poker/with_read_input/poker.py

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
from __future__ import annotations
2+
3+
from dataclasses import dataclass
4+
from enum import Enum, auto
5+
6+
class Suit(Enum):
7+
SPADE = "s"
8+
HEART = "h"
9+
DIAMOND = "d"
10+
CLUB = "c"
11+
12+
class Rank(Enum):
13+
ONE = "1"
14+
TWO = "2"
15+
THREE = "3"
16+
FOUR = "4"
17+
FIVE = "5"
18+
SIX = "6"
19+
SEVEN = "7"
20+
EIGHT = "8"
21+
NINE = "9"
22+
TEN = "T"
23+
JACK = "J"
24+
QUEEN = "Q"
25+
KING = "K"
26+
ACE = "A"
27+
28+
class HandRankType(Enum):
29+
HIGH_CARD = auto()
30+
PAIR = auto()
31+
32+
RANK_ORDER = tuple(r for r in Rank)
33+
34+
35+
@dataclass
36+
class Card:
37+
rank: Rank
38+
suit: Suit
39+
40+
@classmethod
41+
def from_str(cls, card_string: str) -> Card:
42+
rank, suit = card_string
43+
return Card(rank=Rank(rank), suit=Suit(suit))
44+
45+
def __gt__(self, other):
46+
return RANK_ORDER.index(self.rank) > RANK_ORDER.index(other.rank)
47+
48+
@dataclass
49+
class HandRank:
50+
type: HandRankType
51+
values: list[Rank]
52+
53+
54+
def read_input(input_str: str) -> list[list[Card]]:
55+
hands = input_str.split('\n')
56+
return [
57+
[Card.from_str(card) for card in hand.strip().split(' ')] for hand in hands
58+
]
59+
60+
61+
def rank_hand(hand: list[Card]) -> HandRank:
62+
values = [card.rank for card in reversed(sorted(hand))]
63+
if (values[0] == values[1]):
64+
return HandRank(
65+
type=HandRankType.PAIR,
66+
values=values,
67+
)
68+
return HandRank(
69+
type=HandRankType.HIGH_CARD,
70+
values=values,
71+
)

tests/poker/__init__.py

Whitespace-only changes.

tests/poker/with_read_input/__init__.py

Whitespace-only changes.
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
from poker.with_read_input.poker import *
2+
import pytest
3+
4+
king_of_spade = Card(rank=Rank.KING, suit=Suit.SPADE)
5+
nine_of_diamond = Card(rank=Rank.NINE, suit=Suit.DIAMOND)
6+
nine_of_spade = Card(rank=Rank.NINE, suit=Suit.SPADE)
7+
ace_of_club = Card(rank=Rank.ACE, suit=Suit.CLUB)
8+
9+
@pytest.mark.parametrize(
10+
"input,expected",
11+
[
12+
('Ks', [[king_of_spade]]),
13+
('Ks\n9d', [[king_of_spade], [nine_of_diamond]]),
14+
('Ks 9d\nAc 9d', [[king_of_spade,nine_of_diamond], [ace_of_club,nine_of_diamond]]),
15+
(' Ks ', [[king_of_spade]]),
16+
]
17+
)
18+
def test_read_input(input: str, expected: list[list[Card]]) -> None:
19+
result = read_input(input)
20+
assert result == expected
21+
22+
@pytest.mark.parametrize(
23+
"hand,expected",
24+
[
25+
([king_of_spade, nine_of_diamond], HandRank(type=HandRankType.HIGH_CARD, values=[Rank.KING, Rank.NINE])),
26+
([nine_of_diamond, king_of_spade], HandRank(type=HandRankType.HIGH_CARD, values=[Rank.KING, Rank.NINE])),
27+
([nine_of_diamond, nine_of_spade], HandRank(type=HandRankType.PAIR, values=[Rank.NINE, Rank.NINE])),
28+
]
29+
)
30+
def test_rank_hand(hand: list[Card], expected: HandRank):
31+
result = rank_hand(hand)
32+
assert result == expected

0 commit comments

Comments
 (0)