Advent of code

 18 décembre 2023 

  Lavaduct Lagoon : Calculer l'aire délimitée par un parcours
L 6 (#250012)
   
U 2 (#66d6a3)
   
L 4 (#0a6532)
   
      ⋮   
D 5 (#72f323)
   
      
Comme au problème 10, on peut résoudre ça efficacement avec formule de laçage + théorème de Pick. Il faut juste s'assurer que la courbe ne se coupe pas.
  1. code.py
  2. fonction_dessiner.py
f = open("input.txt", 'r', encoding='utf-8')
lines = [line[:-1] for line in f.readlines()]

Move = tuple[tuple[int,int], int]

DIRS = {'L':(-1,0), 'R':(1,0), 'D':(0,1), 'U':(0,-1)}
moves_partie1: list[Move] = []
moves_partie2: list[Move] = []

for line in lines:
    #   L 6 (#250012)
    [lettre, nombre, couleur] = line.split()

    moves_partie1.append( (DIRS[lettre], int(nombre)) )

    nombre   = int(couleur[2:-2], 16)
    code_dir = int(couleur[-2:-1])
    lettre = 'RDLU'[code_dir]
    moves_partie2.append( (DIRS[lettre], nombre) )


# Via formule de laçage et Théorème de Pick, ne va que si la courbe ne se croise pas.
def get_area(moves: list[Move]) -> int:
    nb = 0
    sum_det = 0
    pos = [0,0]
    last_pos = None
    for dir, n in moves:
        sum_det += n*(pos[0]*dir[1] - pos[1]*dir[0])
        pos[0]  += n*dir[0]
        pos[1]  += n*dir[1]
        nb += n
    return abs(sum_det) // 2 + nb//2 + 1


print("Réponse partie 1:", get_area(moves_partie1))
print("Réponse partie 2:", get_area(moves_partie2))