Posté par steph1978 .
En réponse au message Avent du Code, jour 23.
Évalué à 4.
Dernière modification le 23 décembre 2022 à 18:15.
Pas si difficile aujourd'hui mais j'ai butté sur à peut prêt toutes les instructions
- ah si un elf peut bouger partout alors il ne bouge pas ?!
- ah les directions changent a chaque tour ?!
- mais qu'est ce qu'il se passe au bord ?
- ah la grille est infinie ?!
Ce dernier point m'a contraint à changer ma conception : d'une matrice à un set. Moins sympa pour débuguer mais nécessaire quand on ne connaît pas les limites du jeu. Finalement un code plus simple car pas de gestion de dépassement, et utilisation des fonctions de set (appartenance, union, différences) et des list comprehension un peu partout. Et accessoirement beaucoup plus rapide : 1025 round en 8s pour le tout.
python, 60 loc
importsysE=set()# elvesfory,linenumerate(sys.stdin.read().splitlines()):forx,cinenumerate(l):ifc=='#':E.add((y,x))defcan(y,x):can1=(y-1,x-1)notinEcan2=(y-1,x)notinEcan3=(y-1,x+1)notinEcan4=(y,x+1)notinEcan5=(y+1,x+1)notinEcan6=(y+1,x)notinEcan7=(y+1,x-1)notinEcan8=(y,x-1)notinEreturn[can1,can2,can3,can4,can5,can6,can7,can8]defcanN(y,x,can1,can2,can3,can4,can5,can6,can7,can8):ifcan1andcan2andcan3:return(y-1,x)defcanS(y,x,can1,can2,can3,can4,can5,can6,can7,can8):ifcan5andcan6andcan7:return(y+1,x)defcanW(y,x,can1,can2,can3,can4,can5,can6,can7,can8):ifcan7andcan8andcan1:return(y,x-1)defcanE(y,x,can1,can2,can3,can4,can5,can6,can7,can8):ifcan3andcan4andcan5:return(y,x+1)fromcollectionsimportdequedirs=deque([canN,canS,canW,canE])forrinrange(int(sys.argv[1])):P=dict()foreinE:# each elve(y,x)=emoves=[d(y,x,*can(y,x))fordindirs]ifall(misnotNoneforminmoves):continueifall(misNoneforminmoves):continuep=next(filter(lambdam:misnotNone,moves))ifpnotinP:# can moveP[p]=(y,x)else:# occupied, invalidate moveP[p]=Nonemoved={vfork,vinP.items()ifvisnotNone}newpos={kfork,vinP.items()ifvisnotNone}ifr+1==10:minx=min(xfor(x,_)inE)maxx=max(xfor(x,_)inE)miny=min(yfor(_,y)inE)maxy=max(yfor(_,y)inE)print((maxx-minx+1)*(maxy-miny+1)-len(E))iflen(newpos)==0:print(f"no move after {r+1}")breakE=(E-moved)|newposdirs.rotate(-1)
# ready, set, python
Posté par steph1978 . En réponse au message Avent du Code, jour 23. Évalué à 4. Dernière modification le 23 décembre 2022 à 18:15.
Pas si difficile aujourd'hui mais j'ai butté sur à peut prêt toutes les instructions
- ah si un elf peut bouger partout alors il ne bouge pas ?!
- ah les directions changent a chaque tour ?!
- mais qu'est ce qu'il se passe au bord ?
- ah la grille est infinie ?!
Ce dernier point m'a contraint à changer ma conception : d'une matrice à un set. Moins sympa pour débuguer mais nécessaire quand on ne connaît pas les limites du jeu. Finalement un code plus simple car pas de gestion de dépassement, et utilisation des fonctions de set (appartenance, union, différences) et des list comprehension un peu partout. Et accessoirement beaucoup plus rapide : 1025 round en 8s pour le tout.
python, 60 loc