Coverage for Day5 / part1.py: 100%
19 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 : 5
8Part : 1
10Ce script calcule combien d'identifiants apparaissant dans la seconde partie de
11l'input appartiennent à l'un des intervalles définis dans la première partie.
13Chaque intervalle est défini sous la forme "start-stop". Les lignes suivantes
14peuvent contenir des identifiants individuels. Un identifiant est comptabilisé
15dès qu'il appartient à au moins un intervalle présent dans la liste.
17La logique se base sur :
18- l'extraction de tous les intervalles "start-stop",
19- la vérification de chaque identifiant individuel pour déterminer s'il est
20 inclus dans l'un des intervalles collectés.
22.. codeauthor:: Alexandre Condette <alexandre.condette@wanadoo.fr>
23"""
26# %% ========================================================================
27# Input data
28def get_input(day: int = 1, example: bool = False) -> list:
29 """
30 Lit le fichier d'input pour le jour donné.
32 :param day: numéro du jour AOC
33 :param example: si True, utilise le fichier example.txt sinon input.txt
34 :return: liste de lignes du fichier
35 :rtype: list
36 """
37 file = 'example.txt' if example else 'input.txt'
38 with open(f"./Day{day}/{file}", 'r', encoding='utf-8') as f:
39 return [line.rstrip('\n') for line in f]
41# ===========================================================================
43# %% ========================================================================
44# Résolution
45def solve(data: list) -> int:
46 """
47 Analyse les lignes d'input et calcule le nombre d'identifiants individuels
48 présents dans l'un des intervalles définis plus haut dans le fichier.
50 L'input est supposé structuré comme suit :
51 - Première section : plusieurs lignes au format "start-stop".
52 - Deuxième section : des identifiants uniques, un par ligne.
54 Pour chaque identifiant rencontré, le script vérifie s'il appartient à
55 l'une des plages collectées. Dès qu'un intervalle contient l'ID, il est
56 comptabilisé et la recherche pour cet ID s'arrête.
58 :param data: Liste brute des lignes du fichier.
59 :return: Nombre d'identifiants appartenant à au moins un intervalle.
60 :rtype: int
61 """
62 fresh: int = 0
63 intervals: list = []
65 # 1. Collecte des intervalles
66 for line in data:
67 if "-" in line:
68 start, stop = map(int, line.split("-"))
69 intervals.append((start, stop))
71 # 2. Vérification des IDs uniques
72 for line in data:
73 if "-" not in line and line:
74 id = int(line)
76 # Test d'appartenance à l'un des intervalles
77 for start, stop in intervals:
78 if start <= id <= stop:
79 fresh += 1
80 break
82 return fresh
84# ===========================================================================
86# %%
87if __name__ == "__main__":
88 RESULT = solve(get_input(5, False))
90 print("\n" + "═" * 60)
91 print(" 🔐 Advent of Code 2025 — Day 5 | Part 1".center(60))
92 print("═" * 60)
93 print(f"Ingrédients frais : \033[96m{RESULT}\033[0m")
94 print("═" * 60 + "\n")