def p011(N=4): besth = max( numty.prod(grid[i][j + k] for k in range(N)) for i in range(len(grid)) for j in range(len(grid[0]) - N)) bestv = max( numty.prod(grid[i + k][j] for k in range(N)) for i in range(len(grid) - N) for j in range(len(grid[0]))) bestd = max( numty.prod(grid[i + k][j + k] for k in range(N)) for i in range(len(grid) - N) for j in range(len(grid[0]) - N)) bestu = max( numty.prod(grid[i - k][j + k] for k in range(N)) for i in range(N, len(grid)) for j in range(len(grid[0]) - N)) return max(besth, bestv, bestd, bestu)
def p011(N=4): besth = max(numty.prod(grid[i][j+k] for k in range(N)) for i in range(len(grid)) for j in range(len(grid[0])-N)) bestv = max(numty.prod(grid[i+k][j] for k in range(N)) for i in range(len(grid)-N) for j in range(len(grid[0]))) bestd = max(numty.prod(grid[i+k][j+k] for k in range(N)) for i in range(len(grid)-N) for j in range(len(grid[0])-N)) bestu = max(numty.prod(grid[i-k][j+k] for k in range(N)) for i in range(N,len(grid)) for j in range(len(grid[0])-N)) return max(besth, bestv, bestd, bestu)
def nthperm(N, l): if len(l) == 1: return l lminus1fact = numty.prod(range(1, len(l))) firstelt = N / lminus1fact return [l[firstelt]] + nthperm(N % lminus1fact, l[:firstelt] + l[firstelt + 1:])
def p033(): acc = set([]) for a in range(1, 10): for b in range(1, 10): for c in range(1, 10): ab = 10 * a + b ac = 10 * a + c ca = 10 * c + a bc = 10 * b + c cb = 10 * c + b acc.add(check(ab, ac, b, c)) acc.add(check(ab, ca, b, c)) acc.add(check(ab, bc, a, c)) acc.add(check(ab, cb, a, c)) product = numty.prod(acc) return product.denominator
def p033(): acc = set([]) for a in range(1,10): for b in range(1, 10): for c in range(1, 10): ab = 10*a+b ac = 10*a+c ca = 10*c+a bc = 10*b+c cb = 10*c+b acc.add(check(ab, ac, b, c)) acc.add(check(ab, ca, b, c)) acc.add(check(ab, bc, a, c)) acc.add(check(ab, cb, a, c)) product = numty.prod(acc) return product.denominator
def p040(): return numty.prod(d(10**k) for k in range(0,7))
# # How to bound this? # We don't need to check over 2! + 5*8! if only using digits 1..8. # 9 is tricky because it's so big. # The answer will need to be at least 6 digits long. # If there is only one 9, we only need to check between 9! and 9!+5*8! # If there are two 9s, 2*9! to 2*9!+4*8! # A couple million things to check? import logging import lib.numty as numty logger = logging.getLogger(__name__) fact = [numty.prod(range(1,n+1)) for n in range(10)] def p034(): acc = 0 ranges = [(10, fact[2] + 5 * fact[8])] for n in range(1,7): lower = n*fact[9] upper = lower + fact[8]*(len(str(lower))-n) ranges.append((lower, upper)) for l, u in ranges: for n in range(l, u): if sum(fact[int(d)] for d in str(n)) == n: acc += n logger.debug(n) n += 1 return acc
def p020(N=100): return sum(int(d) for d in str(numty.prod(range(1,N+1))))
def choose(n,k): return int(numty.prod(Fraction(n-i,k-i) for i in range(k)))
def magic(n): return sum(numty.prod(range(1,int(d)+1)) for d in str(n))
def phi(n, factoredn=None): if not factoredn: factoredn = numty.factor(n) return numty.prod(p**(e-1)*(p-1) for p,e in factoredn.items())
def p040(): return numty.prod(d(10 ** k) for k in range(0, 7))
def radtable(n): return [numty.prod(r.keys()) for r in utils.factortable(n)]
def nthperm(N, l): if len(l) == 1: return l lminus1fact = numty.prod(range(1,len(l))) firstelt = N/lminus1fact return [l[firstelt]] + nthperm(N % lminus1fact, l[:firstelt]+l[firstelt+1:])
def rad(n): return numty.prod(utils.factor(n).keys())
def p008(N=13): return max( numty.prod(int(d) for d in number[i:i + N]) for i in range(len(number) - N))
# # How to bound this? # We don't need to check over 2! + 5*8! if only using digits 1..8. # 9 is tricky because it's so big. # The answer will need to be at least 6 digits long. # If there is only one 9, we only need to check between 9! and 9!+5*8! # If there are two 9s, 2*9! to 2*9!+4*8! # A couple million things to check? import logging import lib.numty as numty logger = logging.getLogger(__name__) fact = [numty.prod(range(1, n + 1)) for n in range(10)] def p034(): acc = 0 ranges = [(10, fact[2] + 5 * fact[8])] for n in range(1, 7): lower = n * fact[9] upper = lower + fact[8] * (len(str(lower)) - n) ranges.append((lower, upper)) for l, u in ranges: for n in range(l, u): if sum(fact[int(d)] for d in str(n)) == n: acc += n logger.debug(n) n += 1
def phi(n, factoredn=None): if not factoredn: factoredn = numty.factor(n) return numty.prod(p**(e - 1) * (p - 1) for p, e in factoredn.items())
def p020(N=100): return sum(int(d) for d in str(numty.prod(range(1, N + 1))))
def numdivs(factorization): return numty.prod((e+1) for e in factorization.values())
def p008(N=13): return max(numty.prod(int(d) for d in number[i:i+N]) for i in range(len(number)-N))
def numdivs(factorization): return numty.prod((e + 1) for e in factorization.values())