Advent of Code 2025: 2
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} $$