Bon, en fait, pas besoin d'énumérer de façon aussi laborieuse bien sûr :
from__future__importannotationsfromenumimportEnumfromtypingimportIterable,Iterator,Set,TupleCoords=Tuple[int,int]classDirection(Enum):O=(0,0)U=(0,1)D=(0,-1)L=(-1,0)R=(1,0)def__init__(self,dx,dy):self.dx=dxself.dy=dyclassKnot:def__init__(self,x:int,y:int):self.x=xself.y=y@propertydefcoords(self)->Coords:return(self.x,self.y)defmove(self,direction:Direction)->None:self.x+=direction.dxself.y+=direction.dydefdist(self,other:Knot)->int:returnmax(abs(self.x-other.x),abs(self.y-other.y))deffollow(self,other:Knot)->None:ifself.dist(other)<=1:returnifself.x<other.x:self.x+=1ifself.x>other.x:self.x-=1ifself.y<other.y:self.y+=1ifself.y>other.y:self.y-=1classRope:def__init__(self,n_knots:int)->None:self.knots=[Knot(0,0)for_inrange(n_knots)]@propertydefhead(self)->Knot:returnself.knots[0]@propertydeftail(self)->Knot:returnself.knots[-1]defmove(self,direction:Direction)->None:self.head.move(direction)foriinrange(1,len(self.knots)):leader=self.knots[i-1]follower=self.knots[i]follower.follow(leader)defimport_lines(lines:Iterable[str])->Iterator[Direction]:forlineinlines:word1,word2=line.split()direction=Direction[word1]repeat=int(word2)for_inrange(repeat):yielddirectiondefsolve_both(lines:Iterable[str])->Tuple[int,int]:"""Solve both parts of today's puzzle"""rope=Rope(10)visited1=set()# type: Set[Coords]visited2=set()# type: Set[Coords]fordirectioninimport_lines(lines):rope.move(direction)visited1.add(rope.knots[1].coords)visited2.add(rope.tail.coords)returnlen(visited1),len(visited2)
[^] # Re: En Python, modélisé
Posté par 🚲 Tanguy Ortolo (site web personnel) . En réponse au message Avent du Code, jour 9. Évalué à 3. Dernière modification le 09 décembre 2022 à 16:58.
Bon, en fait, pas besoin d'énumérer de façon aussi laborieuse bien sûr :