◂ 7 décembre 2023 ▸
Camel Cards : Trier des mains de poker
55559 2
Q525J 656
457J4 324
T6668 259
38847 640
⋮
J'ai ajouté une méthode à la classe Counter directement au lieu de faire une sous-classe.
- code.py
from collections import Counter
f = open("input.txt", 'r', encoding='utf-8')
lines = [line[:-1] for line in f.readlines()]
CARDS = "_23456789TJQKA"
def card_to_num(c):
return CARDS.index(c)
VALEUR_JOKER = card_to_num('J')
# Types
Frequences = list[int]
Hand = list[int]
Valeur = int
SortingHand = tuple[Frequences, Hand, Valeur] # le tri se fait selon la fréquence, puis selon les cartes
# Upgradons la classe Counter !
def get_frequences(self) -> Frequences:
freq = list(self.values())
freq.sort(reverse = True)
return freq if freq else [0]
Counter.get_frequences = get_frequences
# Aussi possible de faire cet upgrade en une ligne :
# Counter.get_frequences = lambda self: (f:=list(self.values())) and (f.sort(reverse=True) or 1) and (f if f else [0])
hands1: list[SortingHand] = []
hands2: list[SortingHand] = []
for line in lines:
tokens = line.split()
the_hand: Hand = [card_to_num(c) for c in tokens[0]]
valeur: Valeur = int(tokens[1])
counter = Counter(the_hand)
### Partie 1
frequences = counter.get_frequences()
hands1.append( (frequences, the_hand, valeur) )
### Partie 2
# recompter, mais sans les jokers, rajoutés après au décompte le plus grand
counter[VALEUR_JOKER] = 0
nombre_jokers = the_hand.count(VALEUR_JOKER)
frequences = counter.get_frequences()
frequences[0] += nombre_jokers
# baisser la valeur des jokers :
the_hand = [ 0 if valeur == VALEUR_JOKER else valeur for valeur in the_hand]
hands2.append( (frequences, the_hand, valeur) )
for index_partie, hands in enumerate([hands1, hands2]):
hands.sort()
reponse = sum((i+1) * valeur for (i, (f, hand, valeur)) in enumerate(hands))
print(f"Réponse partie {index_partie + 1}:", reponse)
###############
# Façon intelligente de donner un score de fréquences aux mains: [(c) github.com/salt-die/ ]
# sum(hand.count(c) for c in hand)
# 5 => 25
# 4.1 => 17
# 3,2 => 13
# 3,1,1 => 11
# 2,2,1 => 9
# 2,1,1,1 => 7
# 1,1,1,1,1 => 5
###############