Coverage for Day3 / part1.py: 100%
14 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 : 3
8Part : 1
10Ce script identifie les deux digits à conserver dans chaque ligne afin de
11former le plus grand nombre possible selon la logique originale de la Part 1 :
12- On identifie le plus grand digit (sauf le dernier),
13- Puis on cherche le plus grand digit restant après l'index de celui-ci,
14- Le joltage est la concaténation de ces deux chiffres.
16.. codeauthor:: Alexandre Condette <alexandre.condette@wanadoo.fr>
17"""
19# %% ========================================================================
20# Imports
22# ===========================================================================
24# %% ========================================================================
25# Input data
26def get_input(day: int = 1, example: bool = False) -> list:
27 """
28 Lit le fichier d'input pour le jour donné.
30 :param day: numéro du jour AOC
31 :param example: si True, utilise le fichier example.txt sinon input.txt
32 :return: liste de lignes du fichier
33 :rtype: list
34 """
35 file = 'example.txt' if example else 'input.txt'
36 with open(f"./Day{day}/{file}", 'r', encoding='utf-8') as f:
37 return f.readlines()
39# ===========================================================================
41# %% ========================================================================
42# Résolution
43def solve(data: list) -> int:
44 """
45 Calcule le joltage total de toutes les lignes selon la règle de la Part 1 :
47 Pour chaque ligne :
48 -------------------
49 - On convertit chaque caractère en digit.
50 - On cherche le plus grand digit parmi tous sauf le dernier.
51 - On récupère son index.
52 - À partir de ce point, on cherche le plus grand digit restant.
53 - On concatène les deux digits trouvés.
54 - On ajoute cette valeur au joltage total.
56 :param data: Liste brute des lignes d’input.
57 :return: Joltage total.
58 :rtype: int
59 """
60 joltage: int = 0
62 for line in data:
63 # Nettoie la ligne (retire \n, espaces)
64 line = line.strip()
66 # Convertit la ligne en liste de digits
67 digits = [int(d) for d in line]
69 # Premier digit : le maximum dans tous les digits SAUF le dernier
70 first_digit = str(max(digits[:-1]))
72 # Position du premier digit dans la liste, puis on avance d'un cran
73 index = digits.index(int(first_digit)) + 1
75 # Second digit : le maximum dans la partie restante à droite
76 second_digit = str(max(digits[index:]))
78 # Ajout au cumul du joltage
79 joltage += int(first_digit + second_digit)
81 return joltage
83# ===========================================================================
85# %%
86if __name__ == "__main__":
87 RESULT = solve(get_input(3, False))
89 print("\n" + "═" * 60)
90 print(" 🔐 Advent of Code 2025 — Day 3 | Part 1".center(60))
91 print("═" * 60)
92 print(f"Joltage trouvé : \033[96m{RESULT}\033[0m")
93 print("═" * 60 + "\n")