from functools import lru_cache @lru_cache def combs(xs, first=False): if xs == (0, 0, 0, 0): return 1 c = 0 z, o, a, r = xs if (not first) and z > 0: c += combs((z - 1, o, a, r)) if o > 0: c += combs((z, o - 1, a, r)) if a > 0: c += combs((z, o, a - 1, r)) if r > 0: c += 13 * combs((z, o, a, r - 1)) return c def euler_162(): t = 0 for n in range(17): for z in range(1, n + 1): for o in range(1, n + 1): for a in range(1, n + 1): r = n - z - o - a if not r >= 0: continue t += combs((z, o, a, r), True) return hex(t)[2:].upper() if __name__ == "__main__": solution = euler_162() print("e162.py: " + str(solution)) assert(solution == "3D58725572C62302")