Coverage for Day1 / part1.py: 100%

17 statements  

« 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 -*- 

3 

4""" 

5Advent Of Code 2025 

6=================== 

7Day : 1 

8Part : 1 

9 

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. 

12 

13.. codeauthor:: Alexandre Condette <alexandre.condette@wanadoo.fr> 

14""" 

15 

16# %% ======================================================================== 

17# Constantes 

18MOD: int = 100 # Taille du module (0..99) 

19SIGNS: dict = {"R": 1, "L": -1} # Mapping direction → signe 

20 

21# =========================================================================== 

22 

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é. 

28 

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() 

37 

38# =========================================================================== 

39 

40# %% ======================================================================== 

41# Résolution 

42def solve(data) -> int: 

43 """ 

44 Calcule le "password" en simulant les déplacements sur le module circulaire. 

45 

46 La logique de la partie 1 incrémente le password à chaque passage exact sur 0. 

47 

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 

54 

55 for line in data: 

56 line = line.strip() # nettoyage 

57 

58 # Calcul du mouvement signé (dépend de la direction) 

59 movements: int = int(line[1:]) * SIGNS[line[0]] 

60 

61 # Mise à jour de la position 

62 current_pos += movements 

63 

64 # Position modulo MOD 

65 current_pos %= MOD 

66 

67 # Incrément du password si passage exact sur 0 

68 if current_pos == 0: 

69 password += 1 

70 

71 return password 

72 

73# =========================================================================== 

74 

75# %% 

76if __name__ == "__main__": 

77 RESULT = solve(get_input(1, False)) 

78 

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")