Advent of Code 2025: 2

Entradas Archivos Wallpaper Problemas

Este problema consiste en encontrar los numeros cuales tengan dos mitades iguales y sumarlos

Solucion

Mi primera solucion fue convertir los numeros a strings Y compararlos

total = 0
with open("./input.txt", "r") as f:
    lines = f.readlines()
    for line in lines:
        ranges = line.split(",")
        for l_range in ranges:
            ranges = l_range.split("-")
            begin = int(ranges[0])
            end = int(ranges[1])
            for num in range(begin, end+1):
                num = str(num)
                le = len(num)
                max_window = le//2
                primera = num[:max_window]
                segunda = num[max_window:]
                # print("primera mitad: ", primera,
                #      "segunda mitad:", segunda,
                #      "con un max de: ", max_window)
                if primera == segunda:
                    total += int(num)
print(total)

Esta solucion es un poco lenta por la conversion de numerto -> string -> numero y es claro que existe una solucion que no involucre strings, asi que despues de un poco de investigacion llegue a esta solucion

import math
total = 0

with open("./input.txt", "r") as f:
    lines = f.readlines()
    for line in lines:
        ranges = line.split(",")
        for l_range in ranges:
            ranges = l_range.split("-")
            begin = int(ranges[0])
            end = int(ranges[1])
            for num in range(begin, end+1):
                num_d = int(math.log10(num))+1
                if num_d % 2 != 0:
                    continue
                mitad = num_d//2
                potencia = (10**mitad)+1
                # print(f"potencia={potencia}, num = {num}, mitad={
                #      mitad}, resultado={num % potencia}")
                if num % potencia == 0:
                    total += num

print(total)

Sea n un entero con D digitos. Para encontrar n que este formado de una secuencia repetida dos veces A debe tener una cantidad de digitos $$k = D / 25$$

El valor n se puede separar en dos partes la mitad superior y la mitad inferior

$$ n = A \cdot 10^k + A $$

Factorizando A: $$ n = A \cdot (10^k + 1) $$

Se calcula D de la siguiente manera: $$D = \lfloor \log_{10}(n) \rfloor + 1$$

Si D es impar $$D \equiv 1 \pmod 2$$ el número no es válido, caso contrario se define k $$k = D/2$$

Y el numero es valido solo si la division por (10^k + 1) es cero

$$ n \equiv 0 \pmod{10^k + 1} $$