Pourquoi utilisez-vous des dictionnaires plutôt qu'un tableau ? On a 256 boîtes, indexées par un entier de 0 à 255, ça semble naturel de représenter ça par un tableau de 256 boîtes non ?
Mon code :
fromenumimportEnumfromdataclassesimportdataclassimportioimportrefromtypingimportOptional,Selfimportaocdefhash_(s:bytes)->int:value=0forbins:value+=bvalue*=17value%=256returnvalue@dataclass(frozen=True)classLens:focal:intlabel:bytesdef__str__(self)->str:return'%s%d'%(self.label.decode(),self.focal)classOperation(Enum):REM='-'PUT='='classInstruction:def__init__(self,label:bytes,op:Operation,arg:Optional[int]=None):self.label=labelself.box=hash_(label)self.op=opself.arg=argpattern=re.compile('^(.+)([=-])(.*)$')@classmethoddefimport_word(cls,word:str)->Self:if(m:=cls.pattern.match(word))isnotNone:label=m[1].encode('ascii')op=Operation(m[2])arg=Noneif(s:=m[3])!='':arg=int(s)returncls(label,op,arg)raiseValueError('cannot parse instruction')classBox:def__init__(self)->None:self.lenses:list[Lens]=[]defremove(self,label:bytes)->None:fori,lensinenumerate(self.lenses):iflens.label==label:delself.lenses[i]returndefput(self,new_lens:Lens):fori,lensinenumerate(self.lenses):iflens.label==new_lens.label:self.lenses[i]=new_lensreturnself.lenses.append(new_lens)defis_empty(self)->bool:returnlen(self.lenses)==0def__str__(self)->str:return' '.join("[%s]"%str(lens)forlensinself.lenses)classMachine:def__init__(self)->None:self.boxes:tuple[Box]=tuple(Box()for_inrange(256))# type: ignoredef__str__(self)->str:s=io.StringIO()fori,boxinenumerate(self.boxes):ifnotbox.is_empty():s.write('Box %d: %s\n'%(i,str(box)))returns.getvalue()defapply(self,instruction:Instruction)->None:box=self.boxes[instruction.box]ifinstruction.opisOperation.REM:box.remove(instruction.label)returnifinstruction.opisOperation.PUTandinstruction.argisnotNone:lens=Lens(instruction.arg,instruction.label)box.put(lens)returnraiseValueError("invalid instruction")defpower(self)->int:total=0forbox_number,boxinenumerate(self.boxes):forlens_number,lensinenumerate(box.lenses):total+=(box_number+1)*(lens_number+1)*lens.focalreturntotaldefpart1(lines:aoc.Data)->int:"""Solve puzzle part 1: determine the sum of hash value of all instructions"""total=0forlineinlines:forpartinline.rstrip().split(','):h=hash_(part.encode('ascii'))total+=hash_(part.encode('ascii'))returntotaldefpart2(lines:aoc.Data)->int:"""Solve puzzle part 2: determine the sum of staff"""instructions=(Instruction.import_word(part)forlineinlinesforpartinline.rstrip().split(','))machine=Machine()forinstructionininstructions:machine.apply(instruction)returnmachine.power()
# Pourquoi des dictionnaires ?
Posté par 🚲 Tanguy Ortolo (site web personnel) . En réponse au message Advent of Code, jour 15. Évalué à 2. Dernière modification le 15 décembre 2023 à 13:10.
Pourquoi utilisez-vous des dictionnaires plutôt qu'un tableau ? On a 256 boîtes, indexées par un entier de 0 à 255, ça semble naturel de représenter ça par un tableau de 256 boîtes non ?
Mon code :