def parse(s): ret = [] for pair in s.split(','): x,y = pair.split('-') ret.append((int(x),int(y))) return ret def solve(input): with open(input) as f: ranges = parse(f.read()) t = 0 for lo,hi in ranges: invalid = list(findinvalid(lo,hi)) if len(invalid) == 0: print(lo,hi,invalid) t += sum(invalid) print(t) def findinvalid(lo, hi): assert len(str(hi)) - len(str(lo)) <= 1 assert lo <= hi j = len(str(lo)) // 2 if j < 1: # (1,19) => [11] j = 1 for B in [10**j, 10**(j+1)]: for i in range(lo//B, hi//B+1): if i < B//10: continue if i >= B: break id = i*B + i if lo <= id <= hi: assert(str(i)+str(i) == str(id)), (i,id) #print(lo, hi, i,B,id) yield id #solve("sample") solve("input")