day 2 part 2
This commit is contained in:
parent
80b0dea13b
commit
a0ff488cf1
35
day02/sol.py
35
day02/sol.py
@ -12,11 +12,17 @@ def solve(input):
|
|||||||
t = 0
|
t = 0
|
||||||
for lo,hi in ranges:
|
for lo,hi in ranges:
|
||||||
invalid = list(findinvalid(lo,hi))
|
invalid = list(findinvalid(lo,hi))
|
||||||
if len(invalid) == 0:
|
#if len(invalid) == 0:
|
||||||
print(lo,hi,invalid)
|
# print(lo,hi,invalid)
|
||||||
t += sum(invalid)
|
t += sum(invalid)
|
||||||
print(t)
|
print(t)
|
||||||
|
|
||||||
|
t2 = 0
|
||||||
|
for lo,hi in ranges:
|
||||||
|
invalid2 = set(findinvalid2(lo,hi))
|
||||||
|
t2 += sum(invalid2)
|
||||||
|
print(t2)
|
||||||
|
|
||||||
def findinvalid(lo, hi):
|
def findinvalid(lo, hi):
|
||||||
assert len(str(hi)) - len(str(lo)) <= 1
|
assert len(str(hi)) - len(str(lo)) <= 1
|
||||||
assert lo <= hi
|
assert lo <= hi
|
||||||
@ -36,5 +42,30 @@ def findinvalid(lo, hi):
|
|||||||
#print(lo, hi, i,B,id)
|
#print(lo, hi, i,B,id)
|
||||||
yield 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("sample")
|
||||||
solve("input")
|
solve("input")
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user