Coverage for Day5 / part1.py: 100%

19 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 : 5 

8Part : 1 

9 

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. 

12 

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. 

16 

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. 

21 

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

23""" 

24 

25 

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é. 

31 

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] 

40 

41# =========================================================================== 

42 

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. 

49 

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. 

53 

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. 

57 

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 = [] 

64 

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

70 

71 # 2. Vérification des IDs uniques 

72 for line in data: 

73 if "-" not in line and line: 

74 id = int(line) 

75 

76 # Test d'appartenance à l'un des intervalles 

77 for start, stop in intervals: 

78 if start <= id <= stop: 

79 fresh += 1 

80 break 

81 

82 return fresh 

83 

84# =========================================================================== 

85 

86# %% 

87if __name__ == "__main__": 

88 RESULT = solve(get_input(5, False)) 

89 

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