• # python tranquille

    Posté par . 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).

    import sys
    S = set() # cubes
    for l in sys.stdin.read().splitlines():
     S.add(tuple(map(int,l.split(','))))
    A = 23
    L = set() # water
    for x in range(-2,A+1):
     for y in range(-2,A+1):
     L.add((x,y,-2))
    more = True
    while more:
     c = 0
     for x in range(-2,A+1):
     for y in range(-2,A+1):
     for z in range(-2,A+1):
     if (x,y,z) not in S and (x,y,z) not in L: # water can only expand in air
     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) in L: # if neighbour is water
     L.add((x,y,z)) # water expand
     c += 1
     more = (c>0)
    N = 0
    for (x,y,z) in S:
     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) in L:
     N += 1
    print(N)

    Exécution en 0.11s et 11MB RAM.