def special_sets(sets): '''An iterator of special-sum sets among the iterates of the iterator sets.''' pairs_dict = {} for a in sets: n = len(a) pn = pairs_dict.setdefault(n, list(valid_pairs(n))) if II_holds(a, n) and I_holds(a, pn): yield a
def min_special_sum7(M=100): S, A, pairs, done = 0, [], list(valid_pairs(7)), False for a1 in xrange(10, M): # it.count(10): if S and a1 >= (S - 18) / 6.: break #print 'a1', a1 for a2 in xrange(a1 + 1, M): # it.count(a1 + 1): #print 'a1', a1, 'a2', a2 if S and a2 >= (S - 15) / 6.: done = True break for a3 in xrange(a2 + 1, min(M, a1 + a2 - 8)): for a4 in xrange(a3 + 1, min(M, int(ceil((a1 + a2 + a3) / 2.)) - 3)): for a5 in xrange(a4 + 1, min(M, int(ceil((a1 + a2 + a3 + a4) / 3.)) - 1)): for a6 in xrange(a5 + 1, min(M, int(ceil((a1 + a2 + a3 + a4 - a5 - 1) / 2.)))): for a7 in xrange(a6 + 1, min(M, a1 + a2 + a3 + a4 - a5 - a6)): #print '\t\t', (a3 + 1, int(ceil((a1 + a2 + a3) / 2.)) - 3), (a3 + 1, int(ceil((a1 + a2 + a3) / 2.)) - 3), (a4 + 1, int(ceil((a1 + a2 + a3 + a4) / 3.)) - 1), (a5 + 1, int(ceil((a1 + a2 + a3 + a4 - a5 - 1) / 2.))), (a6 + 1, a1 + a2 + a3 + a4 - a5 - a6) a = (a1, a2, a3, a4, a5, a6, a7) if I_holds(a, pairs): Sa = sum(a) #print a, Sa if S == 0 or Sa < S: S, A = Sa, a if done: break return ''.join(map(str, A))