Advent of Code 2025: 4
Este problema consiste en encontrar todos los rollos que tengan menos de 4 rollos alrededor
Solucion
Mi primera solucion consiste en escanear cada uno y contar cuantos rollos tiene a su alrededor
total = 0
with open("./input.txt", "r") as f:
lines = f.readlines()
lines = [x.strip() for x in lines]
max_x = len(lines)
max_y = len(lines[0])
for x, line in enumerate(lines):
for y, char in enumerate(line):
if char == "@":
alrededor = 0
for i in range(x-1, x+2):
for j in range(y-1, y+2):
if i < 0 or j < 0 or i >= max_x or j >= max_y:
continue
if i == x and j == y:
continue
if lines[i][j] == "@":
alrededor += 1
if alrededor < 4:
total += 1
print(total)
Pero existe una mejor solucion, en lugar de buscar en el array y acceder basado en coordenadas, solo guardamos las coordenadas y buscamos en el set si las coordenadas existen en el set
paper_rolls = set()
with open("./input.txt", "r") as f:
for r, line in enumerate(f):
for c, char in enumerate(line.strip()):
if char == '@':
paper_rolls.add((r, c))
total = 0
deltas = [
(-1, -1), (-1, 0), (-1, 1),
(0, -1), (0, 1),
(1, -1), (1, 0), (1, 1)
]
for r, c in paper_rolls:
neighbors = 0
for dr, dc in deltas:
nr, nc = r + dr, c + dc
if (nr, nc) in paper_rolls:
neighbors += 1
if neighbors >= 4:
break
if neighbors < 4:
total += 1
print(total)