La partie 1 étant un échauffement, parlons partie 2. Il faut "remplir" toutes les aspérités d'une boule constituée de petits cubes de 1x1x1 et dont la surface est irrégulière. Et compté les surfaces exposées au liquide.
vizu
La visualisation m'a bien aidé :
On peut voir les creux qui doivent se remplir.
code partie 2
J'ai rempli par itération (while True) en m'arrêtant quand plus rien de nouveau ne se remplissait.
Ensuite, pour chaque cube, on compte combien de face sont en contact avec de l'eau (6 voisins, 2 par dimension x, y, z).
importsysS=set()# cubesforlinsys.stdin.read().splitlines():S.add(tuple(map(int,l.split(','))))A=23L=set()# waterforxinrange(-2,A+1):foryinrange(-2,A+1):L.add((x,y,-2))more=Truewhilemore:c=0forxinrange(-2,A+1):foryinrange(-2,A+1):forzinrange(-2,A+1):if(x,y,z)notinSand(x,y,z)notinL:# water can only expand in airfor(i,j,k)in[(0,0,1),(0,0,-1),(0,1,0),(0,-1,0),(1,0,0),(-1,0,0)]:if(x+i,y+j,z+k)inL:# if neighbour is waterL.add((x,y,z))# water expandc+=1more=(c>0)N=0for(x,y,z)inS:for(i,j,k)in[(0,0,1),(0,0,-1),(0,1,0),(0,-1,0),(1,0,0),(-1,0,0)]:if(x+i,y+j,z+k)inL:N+=1print(N)
# python tranquille
Posté par steph1978 . En réponse au message Avent du Code, jour 18. Évalué à 4.
Relativement facile ce jour
La partie 1 étant un échauffement, parlons partie 2. Il faut "remplir" toutes les aspérités d'une boule constituée de petits cubes de 1x1x1 et dont la surface est irrégulière. Et compté les surfaces exposées au liquide.
vizu
La visualisation m'a bien aidé :
On peut voir les creux qui doivent se remplir.
code partie 2
J'ai rempli par itération (
while True) en m'arrêtant quand plus rien de nouveau ne se remplissait.Ensuite, pour chaque cube, on compte combien de face sont en contact avec de l'eau (6 voisins, 2 par dimension x, y, z).
Exécution en 0.11s et 11MB RAM.