38 lines
849 B
Python
38 lines
849 B
Python
|
import math
|
||
|
from itertools import permutations
|
||
|
|
||
|
|
||
|
def first_n_digits(num, n):
|
||
|
# https://stackoverflow.com/questions/41271299/how-can-i-get-the-first-two-digits-of-a-number
|
||
|
p = int(math.log(num, 10)) - n + 1
|
||
|
if p < 0:
|
||
|
return num
|
||
|
return num // 10 ** (int(math.log(num, 10)) - n + 1)
|
||
|
|
||
|
|
||
|
def is_end_pandigital(n, ps):
|
||
|
return (n % 10**9) in ps
|
||
|
|
||
|
|
||
|
def is_start_pandigital(n, ps):
|
||
|
start = first_n_digits(n, 9)
|
||
|
return start in ps
|
||
|
|
||
|
|
||
|
def euler_104():
|
||
|
a, b = 1, 1
|
||
|
ps = set([int("".join(map(str, p))) for p in permutations(range(1, 10))])
|
||
|
k = 3
|
||
|
while True:
|
||
|
a, b = b, a + b
|
||
|
if is_end_pandigital(b, ps) and is_start_pandigital(b, ps):
|
||
|
return k
|
||
|
k += 1
|
||
|
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
solution = euler_104()
|
||
|
print("e104.py: " + str(solution))
|
||
|
assert(solution == 329468)
|
||
|
|