#! /usr/bin/python3# Advent of Code 2022, day 2fromtypingimportIterable,Optional,TypeVar# '@' is not a valid item type, but it does no harm, and having it makes the# value of each item type equal to its index in this string. :-)letters="@abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"priorities={letter:valuefor(value,letter)inenumerate(letters)}classRucksack:def__init__(self,left:str,right:str):self.left=leftself.right=rightdefanomaly(self)->str:forletterinself.left:ifletterinself.right:returnletterraiseValueError("no anomaly in this rucksack")def__contains__(self,letter:str)->bool:returnletterinself.leftorletterinself.rightdefimport_sack(line):n=len(line)-1# do not count final '\n'left=line[0:n//2]right=line[n//2:n]returnRucksack(left,right)T=TypeVar('T')defgroup(iterable:Iterable[T],n:int)->Iterable[list[T]]:result=[]# type: list[T]foriteminiterable:result.append(item)iflen(result)>=n:yieldresultresult=[]yieldresultdefpart1(lines:Iterable[str])->int:total=0forlineinlines:sack=import_sack(line)total+=priorities[sack.anomaly()]returntotaldefpart2(lines:Iterable[str])->int:total=0forline_groupingroup(lines,3):sacks=[import_sack(line)forlineinline_group]forletterinletters:ifall(letterinsackforsackinsacks):total+=priorities[letter]breakreturntotal
# En Python, classieux
Posté par 🚲 Tanguy Ortolo (site web personnel) . En réponse au message Avent du Code, jour 3. Évalué à 3.