Coverage for Day6 / part1.py: 100%
20 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 : 6
8Part : 1
10Ce script résout le puzzle Day 6 en évaluant une série d’expressions
11mathématiques disposées en colonnes.
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
17Chaque colonne représente une expression à évaluer :
18 operand_0 <op> operand_1 <op> operand_2 <op> ...
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.
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
30.. codeauthor:: Alexandre Condette <alexandre.condette@wanadoo.fr>
31"""
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é.
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]
49# ===========================================================================
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.
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
65 :param lines: List[str], lignes de l'entrée
66 :return: Somme des résultats des expressions
67 """
68 total_sum = 0
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)
77 # --- Extraction des opérateurs ---
78 operators = [op.strip() for op in lines[-1].split(' ') if op != '']
80 # --- Évaluation colonne par colonne ---
81 nb_columns = len(operators)
83 for col in range(nb_columns):
84 expression = ""
86 # Construction de l’expression : v0 op v1 op v2 ...
87 for row in range(len(operands_matrix)):
88 expression += operands_matrix[row][col]
90 if row != len(operands_matrix) - 1:
91 expression += operators[col]
93 # Évaluation de la colonne et accumulation
94 total_sum += eval(expression)
96 return total_sum
99# ===========================================================================
101# %%
102if __name__ == "__main__":
103 RESULT = solve(get_input(6, False))
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")