Coverage for Day1 / part1.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 : 1
10Ce script calcule le "password" pour l'énigme du jour 1, partie 1,
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 la partie 1 incrémente le password à chaque passage exact sur 0.
48 :param data: liste de mouvements sous forme de chaînes, ex. "R10", "L5"
49 :return: valeur finale du password
50 :rtype: int
51 """
52 password: int = 0 # compteur de passages "modulo" sur 0
53 current_pos: int = 50 # position initiale
55 for line in data:
56 line = line.strip() # nettoyage
58 # Calcul du mouvement signé (dépend de la direction)
59 movements: int = int(line[1:]) * SIGNS[line[0]]
61 # Mise à jour de la position
62 current_pos += movements
64 # Position modulo MOD
65 current_pos %= MOD
67 # Incrément du password si passage exact sur 0
68 if current_pos == 0:
69 password += 1
71 return password
73# ===========================================================================
75# %%
76if __name__ == "__main__":
77 RESULT = solve(get_input(1, False))
79 print("\n" + "═" * 60)
80 print(" 🔐 Advent of Code 2025 — Day 1 | Part 1".center(60))
81 print("═" * 60)
82 print(f"Password trouvé : \033[96m{RESULT}\033[0m")
83 print("═" * 60 + "\n")