Coverage for Day4 / part1.py: 100%

21 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 : 4 

8Part : 1 

9 

10Ce script identifie tous les rouleaux de papier accessibles.  

11Un rouleau '@' est considéré accessible si moins de quatre de ses  

12huit voisins adjacents sont également des '@'. 

13 

14Le résultat correspond au nombre total de rouleaux accessibles  

15dans l'état initial du schéma. 

16 

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

18""" 

19 

20# %% ======================================================================== 

21# Constantes 

22NEIGHBORS: list = [ 

23 (-1, -1), (-1, 0), (-1, 1), 

24 (0, -1), (0, 1), 

25 (1, -1), (1, 0), (1, 1) 

26] 

27# =========================================================================== 

28 

29# %% ======================================================================== 

30# Input data 

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

32 """ 

33 Lit le fichier d'input pour le jour donné. 

34 

35 :param day: numéro du jour AOC 

36 :param example: si True, utilise le fichier example.txt sinon input.txt 

37 :return: liste de lignes du fichier 

38 :rtype: list 

39 """ 

40 file = 'example.txt' if example else 'input.txt' 

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

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

43 

44# =========================================================================== 

45 

46# %% ======================================================================== 

47# Résolution 

48def solve(data: list) -> int: 

49 """ 

50 Détermine le nombre de rouleaux accessibles dans la grille initiale. 

51 Un rouleau est accessible si moins de quatre de ses huit voisins  

52 sont également des '@'. 

53 

54 :param data: Liste brute des lignes d’input. 

55 :return: Nombre total de rouleaux accessibles. 

56 :rtype: int 

57 """ 

58 paper_rolls = set() 

59 accessible_roll_count = 0 

60 

61 # Collecte des positions '@' 

62 for y, line in enumerate(data): 

63 for x, c in enumerate(line): 

64 if c == "@": 

65 paper_rolls .add((y, x)) 

66 

67 # Comptage des rouleaux accessibles 

68 for (y, x) in paper_rolls : 

69 neighbor_count = 0 

70 for dy, dx in NEIGHBORS: 

71 neighbor = (y + dy, x + dx) 

72 if neighbor in paper_rolls : 

73 neighbor_count += 1 

74 

75 if neighbor_count < 4: 

76 accessible_roll_count += 1 

77 

78 return accessible_roll_count 

79 

80# =========================================================================== 

81 

82# %% 

83if __name__ == "__main__": 

84 RESULT = solve(get_input(4, False)) 

85 

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

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

88 print("═" * 60) 

89 print(f"Rouleaux accessibles : \033[96m{RESULT}\033[0m") 

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