2024-12-02 09:58:35 -06:00

141 lines
3.5 KiB
Python

from enum import IntEnum
INPUT_FILE = "input.text"
possible_letter_cards = {
"A" : 14,
"K" : 13,
"Q" : 12,
"J" : 11,
"T" : 10
}
class HandType(IntEnum):
FiveOfAKind = 7
FourOfAKind = 6
FullHouse = 5
ThreeOfAKind = 4
TwoPair = 3
OnePair = 2
HighCard = 1
def card_to_value(card : str) -> int | None:
if len(card) > 1:
print("Input is more than one character")
return None
if card in possible_letter_cards:
return possible_letter_cards[card]
elif card.isdigit():
num = int(card)
if num <= 9 and num >= 2:
return num
else:
print(f"Card invalid, Card: {card}")
return None
class Hand:
cards : str
card_values : list[int]
bid : int
hand_type : HandType
def __init__(self, hand : str, bid : int):
self.bid = bid
self.cards = hand
self.card_values = []
self.find_hand_type()
self.get_card_values()
print(f"Found hand type is {self.hand_type}")
print(f"Card Values: {self.card_values}")
def find_hand_type(self) -> None:
matches : list[int] = []
print(f"Cards: {self.cards}")
for card in self.cards:
temp_cards = self.cards
temp_cards = temp_cards.replace(card, "")
matches.append(len(temp_cards))
print(f"Matches: {matches}")
if matches.count(0) == 5:
self.hand_type = HandType.FiveOfAKind
elif matches.count(1) == 4:
self.hand_type = HandType.FourOfAKind
elif matches.count(2) == 3 and matches.count(3) == 2:
self.hand_type = HandType.FullHouse
elif matches.count(2) == 3:
self.hand_type = HandType.ThreeOfAKind
elif matches.count(3) == 4:
self.hand_type = HandType.TwoPair
elif matches.count(3) == 2:
self.hand_type = HandType.OnePair
else:
self.hand_type = HandType.HighCard
def get_card_values(self) -> None:
for card in self.cards:
self.card_values.append(card_to_value(card))
def main() -> None:
with open(INPUT_FILE, "r") as f:
data = f.readlines()
# Get all our hands and figure out what they ard
hands: list[Hand] = []
for line in data:
hand, bid = line.split()
hands.append(Hand(hand, int(bid)))
# Sort and decide rank
total = 0
sorted_hands: list[Hand] = bubbleSortHands(hands)
for i in range(0, len(sorted_hands)):
rank = i + 1
total += sorted_hands[i].bid * rank
print(f"Total Winnings: {total}")
# is it fast? probably not, but it works
def bubbleSortHands(arr: list[Hand]) -> list[Hand]:
n: int = len(arr)
for i in range(n):
swapped = False
for j in range(0, n-i-1):
if arr[j].hand_type > arr[j + 1].hand_type:
arr[j], arr[j + 1] = arr[j + 1], arr[j]
swapped = True
elif arr[j].hand_type == arr[j + 1].hand_type:
for card_index in range(0, 5):
if arr[j].card_values[card_index] > arr[j + 1].card_values[card_index]:
arr[j], arr[j + 1] = arr[j + 1], arr[j]
swapped = True
break
elif arr[j].card_values[card_index] < arr[j + 1].card_values[card_index]:
break
if (swapped == False):
break
return arr
if __name__ == "__main__":
main()