Coverage for Day1 / part2.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 : 2 

9 

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. 

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 calcul de la partie 2 inclut la correction des passages exacts sur 0 

47 avec des mouvements négatifs. 

48 

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 

55 

56 for line in data: 

57 line = line.strip() # nettoyage 

58 

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

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

61 

62 # Position non modulo après le mouvement 

63 next_pos = current_pos + movements 

64 

65 # Nombre de passages "modulo" entre current_pos et next_pos 

66 div = next_pos // MOD - current_pos // MOD 

67 

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) 

72 

73 # Nouvelle position modulo 

74 current_pos = next_pos % MOD 

75 

76 return password 

77 

78# =========================================================================== 

79 

80# %% 

81if __name__ == "__main__": 

82 result = solve(get_input(1, False)) 

83 

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