Coverage for Day4 / part1.py: 100%
21 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 : 4
8Part : 1
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 '@'.
14Le résultat correspond au nombre total de rouleaux accessibles
15dans l'état initial du schéma.
17.. codeauthor:: Alexandre Condette <alexandre.condette@wanadoo.fr>
18"""
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# ===========================================================================
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é.
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]
44# ===========================================================================
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 '@'.
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
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))
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
75 if neighbor_count < 4:
76 accessible_roll_count += 1
78 return accessible_roll_count
80# ===========================================================================
82# %%
83if __name__ == "__main__":
84 RESULT = solve(get_input(4, False))
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")