Advent of code

 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.
  1. 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
###############