Coverage for Day6 / part1.py: 100%

20 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 : 6 

8Part : 1 

9 

10Ce script résout le puzzle Day 6 en évaluant une série d’expressions  

11mathématiques disposées en colonnes. 

12 

13L’entrée possède deux sections : 

14 - Une première section contenant les valeurs (opérandes), une valeur par cellule 

15 - Une dernière ligne contenant les opérateurs à appliquer entre les colonnes 

16 

17Chaque colonne représente une expression à évaluer : 

18 operand_0 <op> operand_1 <op> operand_2 <op> ... 

19 

20Les expressions sont évaluées de gauche à droite conformément aux opérateurs fournis. 

21La somme des résultats de toutes les colonnes constitue la sortie finale. 

22 

23La logique générale : 

24 1. Nettoyage et restructuration des lignes pour obtenir une matrice opérandes × colonnes 

25 2. Extraction des opérateurs (dernière ligne) 

26 3. Construction des expressions colonne par colonne 

27 4. Évaluation des expressions 

28 5. Addition des résultats 

29 

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

31""" 

32 

33 

34# %% ======================================================================== 

35# Lecture de l'entrée 

36def get_input(day: int = 1, example: bool = False) -> list: 

37 """ 

38 Lit le fichier d'entrée pour le jour donné. 

39 

40 :param day: Numéro du jour AOC (ex : 6 pour Day 6) 

41 :param example: Si True → example.txt, sinon → input.txt 

42 :return: Liste des lignes brutes du fichier 

43 """ 

44 filename = 'example.txt' if example else 'input.txt' 

45 with open(f"./Day{day}/{filename}", 'r', encoding='utf-8') as f: 

46 return [line.rstrip('\n') for line in f] 

47 

48 

49# =========================================================================== 

50 

51# %% ======================================================================== 

52# Résolution 

53def solve(lines: list) -> int: 

54 """ 

55 Évalue les expressions mathématiques colonne par colonne  

56 et retourne la somme des résultats. 

57 

58 Fonctionnement : 

59 - Toutes les lignes sauf la dernière contiennent les opérandes 

60 - La dernière ligne contient les opérateurs 

61 - Chaque colonne est transformée en une expression (string) 

62 - L'expression est évaluée via eval() 

63 - Le résultat est ajouté à une somme globale 

64 

65 :param lines: List[str], lignes de l'entrée 

66 :return: Somme des résultats des expressions 

67 """ 

68 total_sum = 0 

69 

70 # --- Extraction des opérandes --- 

71 # On nettoie les espaces inutiles, on obtient une matrice : lignes × colonnes 

72 operands_matrix = [] 

73 for line in lines[:-1]: 

74 cleaned = [token.strip() for token in line.split(' ') if token != ''] 

75 operands_matrix.append(cleaned) 

76 

77 # --- Extraction des opérateurs --- 

78 operators = [op.strip() for op in lines[-1].split(' ') if op != ''] 

79 

80 # --- Évaluation colonne par colonne --- 

81 nb_columns = len(operators) 

82 

83 for col in range(nb_columns): 

84 expression = "" 

85 

86 # Construction de l’expression : v0 op v1 op v2 ... 

87 for row in range(len(operands_matrix)): 

88 expression += operands_matrix[row][col] 

89 

90 if row != len(operands_matrix) - 1: 

91 expression += operators[col] 

92 

93 # Évaluation de la colonne et accumulation 

94 total_sum += eval(expression) 

95 

96 return total_sum 

97 

98 

99# =========================================================================== 

100 

101# %% 

102if __name__ == "__main__": 

103 RESULT = solve(get_input(6, False)) 

104 

105 print("\n" + "═" * 60) 

106 print(" 🔐 Advent of Code 2025 — Day 6 | Part 1".center(60)) 

107 print("═" * 60) 

108 print(f"Grand Total : \033[96m{RESULT}\033[0m") 

109 print("═" * 60 + "\n")