Advent of Code 2021 Day 2
Le problème
Partie 1
Dans le problème du jour, nous sommes toujours en train de naviguer dans notre sous-marin à la recherche des clés du traîneau tombées au fin fond de l’océan. Dans l’exercice du Jour 1, on ne faisait que compter les variations en profondeur des mesures récoltées par un sonar, mais on nous apprend désormais que les mesures sont trop grossières et qu’il faut procéder différent.
En entrée, nous avons désormais un fichier qui contient le plan de route du sous-marin, nous permettant de calculer une position horizontale et une profondeur :
forward 5
down 5
forward 8
up 3
down 8
forward 2
Voici comment comprendre ce plan de route :
- Lorsque l’action
forward
est présente, on augmente la position horizontale du nombre affiché à côté ; - Lorsque l’action
down
est présente, on augmente la profondeur du nombre affiché à côté ; - Lorsque l’action
up
est présente, on diminue la profondeur du nombre affiché à côté.
Une fois les instructions toutes lues, le résultat sera le produit de la position horizontale par la profondeur.
Dans cet exercice, l’objectif principal est donc de bien déclarer toutes les variables nécessaires, de bien gérer les deux informations présentes sur chaque ligne, et de faire attention aux types de ces deux informations.
def solve_part_one():
with open('input-small', 'r') as data:
lines = [line.split(" ") for line in data.read().splitlines()]
pos, depth = 0, 0
for action, value in lines:
if action == "forward":
pos += int(value)
elif action == 'down':
depth += int(value)
else:
depth -= int(value)
print(pos * depth)
Partie 2
Dans la seconde partie, on utilise le même jeu de données mais les opérations
sont légèrement différentes. En effet, on introduit une nouvelle variable aim
avec le comportement suivant :
- Lorsque l’action
down
est présente, on augmente la valeur de la variableaim
du nombre affiché à côté de l’instruction ; - Lorsque l’action
up
est présente, on diminue la valeur de la variableaim
du nombre affiché à côté de l’instruction ; - Lorsque l’action
forward
est présente :- On augmente la position horizontale par le nombre affiché à côté ;
- On augmente la profondeur par le produit entre le nombre affiché à côté et
la variable
aim
.
def solve_part_two():
with open('input-large', 'r') as data:
lines = [line.split(" ") for line in data.read().splitlines()]
pos, depth, aim = 0, 0, 0
for action, value in lines:
if action == 'forward':
pos += int(value)
depth += aim * int(value)
elif action == 'down':
aim += int(value)
else:
aim -= int(value)
print(pos * depth)
Les difficultés
On reste dans les premiers jours, cela signifie qu’il n’y a pas énormément de difficultés algorithmiques. Ici, il s’agit surtout de bien lire et séparer les données en entrée. Une fois que ce travail a été correctement réalisé, il suffit d’être à l’aise avec les instructions conditionnelles.