Coverage for Day1 / part2.py: 100%
17 statements
« prev ^ index » next coverage.py v7.13.0, created at 2025-12-12 09:47 +0000
« prev ^ index » next coverage.py v7.13.0, created at 2025-12-12 09:47 +0000
1#! /usr/bin/env python
2# -*- coding: utf-8 -*-
4"""
5Advent Of Code 2025
6===================
7Day : 1
8Part : 2
10Ce script calcule le "password" pour l'énigme du jour 1, partie 2,
11en suivant la logique de déplacements circulaires sur un module MOD.
13.. codeauthor:: Alexandre Condette <alexandre.condette@wanadoo.fr>
14"""
16# %% ========================================================================
17# Constantes
18MOD: int = 100 # Taille du module (0..99)
19SIGNS: dict = {"R": 1, "L": -1} # Mapping direction → signe
21# ===========================================================================
23# %% ========================================================================
24# Input data
25def get_input(day: int = 1, example: bool = False) -> list:
26 """
27 Lit le fichier d'input pour le jour donné.
29 :param day: numéro du jour AOC
30 :param example: si True, utilise le fichier example.txt sinon input.txt
31 :return: liste de lignes du fichier
32 :rtype: list
33 """
34 file = 'example.txt' if example else 'input.txt'
35 with open(f"./Day{day}/{file}", 'r', encoding='utf-8') as f:
36 return f.readlines()
38# ===========================================================================
40# %% ========================================================================
41# Résolution
42def solve(data) -> int:
43 """
44 Calcule le "password" en simulant les déplacements sur le module circulaire.
46 La logique de calcul de la partie 2 inclut la correction des passages exacts sur 0
47 avec des mouvements négatifs.
49 :param data: liste de mouvements sous forme de chaînes, ex. "R10", "L5"
50 :return: valeur finale du password
51 :rtype: int
52 """
53 password: int = 0 # compteur de passages "modulo" sur 0
54 current_pos: int = 50 # position initiale
56 for line in data:
57 line = line.strip() # nettoyage
59 # Calcul du mouvement signé (dépend de la direction)
60 movements: int = int(line[1:]) * SIGNS[line[0]]
62 # Position non modulo après le mouvement
63 next_pos = current_pos + movements
65 # Nombre de passages "modulo" entre current_pos et next_pos
66 div = next_pos // MOD - current_pos // MOD
68 # Mise à jour du password avec correction des passages sur 0
69 password += abs(div) \
70 - int(current_pos == 0 and div < 0) \
71 + int(next_pos % MOD == 0 and movements < 0)
73 # Nouvelle position modulo
74 current_pos = next_pos % MOD
76 return password
78# ===========================================================================
80# %%
81if __name__ == "__main__":
82 result = solve(get_input(1, False))
84 print("\n" + "═" * 60)
85 print(" 🔐 Advent of Code 2025 — Day 1 | Part 2".center(60))
86 print("═" * 60)
87 print(f"Password (méthode 0x434C49434B) : \033[96m{result}\033[0m")
88 print("═" * 60 + "\n")