Advent of Code 2025: 7

Entradas Archivos Wallpaper Problemas

El problema consiste en que hay un rayo y este tiene que pasar por diferentes lineas, pero existe la posibilidad que este se divida en dos rayos, lo que define si esto sucede es si exite un divisor en la linea que se esta revisando

.......S.......
.......|.......
......|^|......
...............
......^.^......
...............
.....^.^.^.....
...............
....^.^...^....
...............
...^.^...^.^...
...............
..^...^.....^..
...............
.^.^.^.^.^...^.
...............

Y se deben de contar cuantas veces se dividio el rayo

Solucion

Mi primera solución consistio en tener solo una linea con los rayos actuales y aplicar la linea siguiente como una “mascara” sobre la linea actual

global total

total = 0


def update(actual: list[bool], val: str):
    for index, el in enumerate(actual):
        if el:
            if val[index] == "^":
                global total
                total += 1
                actual[index-1] = True
                actual[index+1] = True
                actual[index] = False
                pass
    return actual


# with open("./input_test.txt", "r") as f:
with open("./input.txt", "r") as f:
    lines = f.readlines()
    le = len(lines[0])-1
    first = lines[0]
    index = first.find("S")
    bars = [False for _ in range(le)]
    bars[index] = True
    for line in lines:
        line = line.strip()
        bars = update(bars, line)
print(f"Resultado {total}")

print("".join([("|" if x else ".") for x in bars]))

Pero existe una mejor solución, en la cual solo tenemos que almacenar el indice en el que hay un rayo y aplicamos la misma logica de solo buscar si existe un divisor bajo los rayos actuales

global total

total = 0


def update(actual: set, val: str):
    nuevo = set()
    for el in actual:
        print(val[el])
        if val[el] == "^":
            global total
            total += 1
            print(el)
            nuevo.add(el+1)
            nuevo.add(el-1)
        else:
            nuevo.add(el)
    return nuevo

    # with open("./input_test.txt", "r") as f:
with open("./input.txt", "r") as f:
    lines = f.readlines()
    le = len(lines[0])-1
    first = lines[0]
    index = first.find("S")
    bars = set()
    bars.add(index)
    print(bars)
    for line in lines:
        line = line.strip()
        bars = update(bars, line)
print(f"Resultado {total}")