Advent of Code 2025: 4

Entradas Archivos Wallpaper Problemas

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)