#! /usr/bin/python3# Advent of Code 2023, day 4from__future__importannotationsfromcollections.abcimportIterablefromtypingimportSelfimportreclassCard:def__init__(self,id_:int,win_nums:Iterable[int],got_nums:Iterable[int]):self.id=id_self.win_nums=set(win_nums)self.got_nums=set(got_nums)self._matches:Optional[int]=Nonepattern=re.compile(r'^Card +(\d+): ([ \d]+) \| ([ \d]+)\n?$')@classmethoddefimport_line(cls,line:str)->Self:if(m:=cls.pattern.match(line))isnotNone:returncls(int(m[1]),(int(word)forwordinm[2].split()),(int(word)forwordinm[3].split()))print(line)raiseValueError("invalid card description")@propertydefmatches(self)->int:ifself._matchesisNone:self._matches=len(self.win_nums&self.got_nums)assertself._matchesisnotNonereturnself._matches@staticmethoddef_num_to_points(num:int)->int:ifnum<=0:return0return2**(num-1)defpoints(self)->int:returnself._num_to_points(self.matches)defsolve_both_parts(lines:aoc.Data)->tuple[int,int]:"""Solve puzzle parts 1 and 2: determine the sum of all card values and the total number of cards"""# Importcards:list[int,Card]=[]forlineinlines:card=Card.import_line(line)cards.append(card)# Part 1points=sum(card.points()forcardincards)# Part 2copies=[1forcardincards]fori,cardinenumerate(cards):forjinrange(i+1,i+1+card.matches):copies[j]+=copies[i]returnpoints,sum(copies)
# En Python
Posté par 🚲 Tanguy Ortolo (site web personnel) . En réponse au message Advent of Code 2023 : Day 4. Évalué à 4.