◂ 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.
- code.py
- 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))