From a0ff488cf12a76ca0b124611444ca280b271a6d1 Mon Sep 17 00:00:00 2001 From: Andrew Ekstedt Date: Tue, 2 Dec 2025 07:50:21 +0000 Subject: [PATCH] day 2 part 2 --- day02/sol.py | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/day02/sol.py b/day02/sol.py index 395d14f..eed97da 100644 --- a/day02/sol.py +++ b/day02/sol.py @@ -12,11 +12,17 @@ def solve(input): t = 0 for lo,hi in ranges: invalid = list(findinvalid(lo,hi)) - if len(invalid) == 0: - print(lo,hi,invalid) + #if len(invalid) == 0: + # print(lo,hi,invalid) t += sum(invalid) print(t) + t2 = 0 + for lo,hi in ranges: + invalid2 = set(findinvalid2(lo,hi)) + t2 += sum(invalid2) + print(t2) + def findinvalid(lo, hi): assert len(str(hi)) - len(str(lo)) <= 1 assert lo <= hi @@ -36,5 +42,30 @@ def findinvalid(lo, hi): #print(lo, hi, i,B,id) yield id +def findinvalid2(lo, hi): + assert lo <= hi,(lo,hi) + if len(str(hi)) != len(str(lo)): + assert len(str(hi)) - len(str(lo)) == 1 + yield from findinvalid2(lo,10**len(str(lo))-1) + yield from findinvalid2(10**(len(str(hi))-1),hi) + return + N = len(str(hi)) + for d in range(1,N): + if N%d == 0: + B = 10**d + BB = 10**(N-d) + factor = sum(10**k for k in range(0,N,d)) + for i in range(lo//BB, hi//BB+1): + if i < B//10: + continue + if i >= B: + break + id = i*factor + #print(lo,hi,factor,i,id) + if lo <= id <= hi: + #assert(str(i)*(N//d) == str(id)), (i,id) + #print(lo, hi, i,B,id) + yield id + #solve("sample") solve("input")