• # Python

    Posté par . En réponse au message Advent of Code 2023, day 7. Évalué à 1.

    C'est très très très louche : on est un jour impair et la difficulté est raisonnable. Nous sommes trahis.
    POur aujourd'hui, j'ai défini deux classes Hand et HandJoker très semblables et qui ont certains opérateurs surchargés pour pouvoir utiliser la fonction sorted().
    Après les avoir triés dans des listes par catégories, ont les tris et on récupère le score.

    #!/bin/python3
    cardlist = {
     "A" : 14,
     "K" : 13,
     "Q" : 12,
     "J" : 11,
     "T" : 10,
    }
    cardlistjoker = {
     "A" : 14,
     "K" : 13,
     "Q" : 12,
     "J" : 1,
     "T" : 10,
    }
    class Hand:
     def __init__(self, cardstring, points, cardlist):
     self.points = points
     self.cards = []
     for i in cardstring:
     if i in cardlist.keys():
     self.cards.append(cardlist[i])
     else:
     self.cards.append(int(i))
     self.computecat()
     def computecat(self):
     r = {}
     for i in range(2,15):
     r.update({i:self.cards.count(i)})
     if 5 in r.values():
     self.cat = 0
     elif 4 in r.values():
     self.cat = 1
     elif 3 in r.values() and 2 in r.values():
     self.cat = 2
     elif 3 in r.values():
     self.cat = 3
     elif 2 in r.values() and list(r.values()).count(2) == 2:
     self.cat = 4
     elif 2 in r.values():
     self.cat = 5
     else:
     self.cat = 6
     def __lt__(self, otherhand): # self > otherhand
     for i, c in enumerate(self.cards):
     if c > otherhand.cards[i]:
     return True
     elif c < otherhand.cards[i]:
     return False
     raise ValueError
     def __gt__(self, otherhand): # self < otherhand
     for i, c in enumerate(self.cards):
     if c < otherhand.cards[i]:
     return True
     elif c > otherhand.cards[i]:
     return False
     raise ValueError
    class HandJoker(Hand):
     def computecat(self):
     r = {}
     j = self.cards.count(1)
     for i in range(2,15):
     r.update({i:self.cards.count(i)})
     if (5 in r.values()) or (4 in r.values() and j == 1) or (3 in r.values() and j == 2) or (2 in r.values() and j == 3) or (j >= 4):
     self.cat = 0
     elif (4 in r.values()) or (3 in r.values() and j == 1) or (2 in r.values() and j == 2) or (j == 3):
     self.cat = 1
     elif (3 in r.values() and 2 in r.values()) or (2 in r.values() and list(r.values()).count(2) == 2 and j == 1):
     self.cat = 2
     elif (3 in r.values()) or (2 in r.values() and j == 1) or (j == 2):
     self.cat = 3
     elif (2 in r.values()) and (list(r.values()).count(2) == 2):
     self.cat = 4
     elif (2 in r.values()) or (j == 1):
     self.cat = 5
     else:
     self.cat = 6
    def parse_hand(puzzle,joker=False):
     hands = []
     for h in puzzle:
     if h == "":
     continue
     if joker:
     hands.append(HandJoker(h.split()[0], int(h.split()[1]),cardlistjoker))
     else:
     hands.append(Hand(h.split()[0], int(h.split()[1]), cardlist))
     return hands
    def classify(hands):
     rhands =[[],[],[],[],[],[],[],]
     for h in hands:
     rhands[h.cat].append(h)
     hands = []
     for c in rhands:
     for h in sorted(c):
     hands.append(h)
     return hands
    def solve1(puzzle,testing=False):
     s=0
     hands = classify(parse_hand(puzzle))
     hands.reverse()
     for i, h in enumerate(hands):
     s+= (i+1)*h.points
     if testing:
     print(s)
     return s
    def solve2(puzzle,testing=False):
     s = 0
     hands = classify(parse_hand(puzzle,joker=True))
     hands.reverse()
     for i, h in enumerate(hands):
     s+= (i+1)*h.points
     if testing:
     print(s)
     return s
    test1 = """32T3K 765
    T55J5 684
    KK677 28
    KTJJT 220
    QQQJA 483
    """
    result1 = 6440
    test2 = test1
    result2 = 5905
    # for cli invocation
    def solve(short=False,one=True,two=True):
     s1, s2 = False , False
     if one:
     print("----Part 1----")
     if short == False:
     if solve1(test1.split("\n"),testing=True) != result1:
     print("Not working.")
     return False
     else :
     print("Maybe working?")
     with open("input.txt",'r') as file:
     lines = file.read().split("\n")
     s1 = solve1(lines)
     print(s1)
     if two:
     print("----Part 2----")
     if short == False:
     if solve2(test2.split("\n"),testing=True) != result2:
     print("Not working.")
     return False
     else :
     print("Maybe working?")
     with open("input.txt",'r') as file:
     lines = file.read().split("\n")
     s2 = solve2(lines)
     print(s2)
     return s1, s2
    if __name__ == "__main__":
     from sys import argv
     s = False
     one = True
     two = True
     if len(argv) >= 2:
     if "-s" in argv or "--summary" in argv or "--short" in argv:
     s = True
     if "1" in argv:
     two = False
     one = True
     elif "2" in argv:
     one = False
     two = True
     if "2" in argv:
     two = True
     solve(short=s,one=one,two=two)

    L'informatique n'est pas une science exacte, on n'est jamais à l'abri d'un succès