Skip to main content

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 variable aim du nombre affiché à côté de l’instruction ;
  • Lorsque l’action up est présente, on diminue la valeur de la variable aim 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.

comments powered by Disqus