diff --git a/Python/p001.py b/Python/p001.py index 9223db3..4630705 100644 --- a/Python/p001.py +++ b/Python/p001.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23. # @@ -6,6 +6,7 @@ from timeit import default_timer + def main(): start = default_timer() @@ -20,9 +21,10 @@ def main(): end = default_timer() print('Project Euler, Problem 1') - print('Answer: {}'.format(sum_)) + print(f'Answer: {sum}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p002.py b/Python/p002.py index e16c4a0..9d2f4c9 100644 --- a/Python/p002.py +++ b/Python/p002.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting with 1 and 2, the first 10 terms will be: # @@ -8,6 +8,7 @@ from timeit import default_timer + def main(): start = default_timer() @@ -32,9 +33,10 @@ def main(): end = default_timer() print('Project Euler, Problem 2') - print('Answer: {}'.format(sum_)) + print(f'Answer: {sum}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p003.py b/Python/p003.py index 6c953fe..ed283a1 100644 --- a/Python/p003.py +++ b/Python/p003.py @@ -1,14 +1,14 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # The prime factors of 13195 are 5, 7, 13 and 29. # # What is the largest prime factor of the number 600851475143? -from math import floor, sqrt - from timeit import default_timer + from projecteuler import is_prime + # Recursive approach: if num is prime, return num, otherwise # recursively look for the largest prime factor of num divided # by its prime factors until only the largest remains. @@ -21,20 +21,21 @@ def max_prime_factor(num): if num % 2 == 0: return max_prime_factor(num // 2) - else: - i = 3 + i = 3 -# If num is divisible by i and i is prime, find largest -# prime factor of num/i. - while True: - if num % i == 0: - if is_prime(i): - return max_prime_factor(num//i) - i = i + 2 +# If num is divisible by i and i is prime, find largest +# prime factor of num/i. + while True: + if num % i == 0: + if is_prime(i): + return max_prime_factor(num//i) + + i = i + 2 # Should never get here return -1 + def main(): start = default_timer() @@ -43,9 +44,10 @@ def main(): end = default_timer() print('Project Euler, Problem 3') - print('Answer: {}'.format(res)) + print(f'Answer: {res}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p004.py b/Python/p004.py index 891064c..e6737ca 100644 --- a/Python/p004.py +++ b/Python/p004.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # A palindromic number reads the same both ways. The largest palindrome made from the product of two 2-digit numbers is 9009 = 91 × 99. # @@ -7,6 +7,7 @@ from timeit import default_timer from projecteuler import is_palindrome + def main(): start = default_timer() @@ -25,9 +26,10 @@ def main(): end = default_timer() print('Project Euler, Problem 4') - print('Answer: {}'.format(max_)) + print(f'Answer: {max_}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p005.py b/Python/p005.py index 460dcf4..e49e28c 100644 --- a/Python/p005.py +++ b/Python/p005.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # 2520 is the smallest number that can be divided by each of the numbers from 1 to 10 without any remainder. # @@ -7,6 +7,7 @@ from timeit import default_timer from projecteuler import lcmm + def main(): start = default_timer() @@ -19,9 +20,10 @@ def main(): end = default_timer() print('Project Euler, Problem 5') - print('Answer: {}'.format(res)) + print(f'Answer: {res}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p006.py b/Python/p006.py index e15a697..08ece15 100644 --- a/Python/p006.py +++ b/Python/p006.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # The sum of the squares of the first ten natural numbers is, # @@ -14,6 +14,7 @@ from timeit import default_timer + def main(): start = default_timer() @@ -30,9 +31,10 @@ def main(): end = default_timer() print('Project Euler, Problem 6') - print('Answer: {}'.format(square_sum - sum_squares)) + print(f'Answer: {square_sum - sum_squares}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p007.py b/Python/p007.py index 9d65252..fd61e42 100644 --- a/Python/p007.py +++ b/Python/p007.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13, we can see that the 6th prime is 13. # @@ -7,6 +7,7 @@ from timeit import default_timer from projecteuler import is_prime + def main(): start = default_timer() @@ -25,9 +26,10 @@ def main(): end = default_timer() print('Project Euler, Problem 7') - print('Answer: {}'.format(n)) + print(f'Answer: {n}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p008.py b/Python/p008.py index 8b8b090..9531e73 100644 --- a/Python/p008.py +++ b/Python/p008.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # The four adjacent digits in the 1000-digit number that have the greatest product are 9 × 9 × 8 × 9 = 5832. # @@ -27,6 +27,7 @@ from timeit import default_timer + def main(): start = default_timer() @@ -69,9 +70,10 @@ def main(): end = default_timer() print('Project Euler, Problem 8') - print('Answer: {}'.format(max_)) + print(f'Answer: {max_}') + + print(f'Elapsed time: {end - start:.9f} seconds'.format(end - start)) - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p009.py b/Python/p009.py index 2dbb14c..18bda2c 100644 --- a/Python/p009.py +++ b/Python/p009.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # A Pythagorean triplet is a set of three natural numbers, a < b < c, for which, # @@ -11,9 +11,9 @@ # Find the product abc. from math import gcd - from timeit import default_timer + def main(): start = default_timer() @@ -61,9 +61,10 @@ def main(): end = default_timer() print('Project Euler, Problem 9') - print('Answer: {}'.format(a * b * c)) + print(f'Answer: {a * b * c}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p010.py b/Python/p010.py index 08fe9bb..64d791b 100644 --- a/Python/p010.py +++ b/Python/p010.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17. # @@ -7,12 +7,13 @@ from timeit import default_timer from projecteuler import sieve + def main(): start = default_timer() N = 2000000 -# Use the function in projecteuler.py implementing the +# Use the function in projecteuler.py implementing the # Sieve of Eratosthenes algorithm to generate primes. primes = sieve(N) sum_ = 0 @@ -25,9 +26,10 @@ def main(): end = default_timer() print('Project Euler, Problem 10') - print('Answer: {}'.format(sum_)) + print(f'Answer: {sum_}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p011.py b/Python/p011.py index 285efee..ce3ba40 100644 --- a/Python/p011.py +++ b/Python/p011.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # In the 20×20 grid below, four numbers along a diagonal line have been marked in red. # @@ -29,6 +29,7 @@ from timeit import default_timer + def main(): start = default_timer() @@ -51,7 +52,7 @@ def main(): [4, 42, 16, 73, 38, 25, 39, 11, 24, 94, 72, 18, 8, 46, 29, 32, 40, 62, 76, 36], [20, 69, 36, 41, 72, 30, 23, 88, 34, 62, 99, 69, 82, 67, 59, 85, 74, 4, 36, 16], [20, 73, 35, 29, 78, 31, 90, 1, 74, 31, 49, 71, 48, 86, 81, 16, 23, 57, 5, 54], - [1, 70, 54, 71, 83, 51, 54, 69, 16, 92, 33, 48, 61, 43, 52, 1, 89, 19, 67, 48]]; + [1, 70, 54, 71, 83, 51, 54, 69, 16, 92, 33, 48, 61, 43, 52, 1, 89, 19, 67, 48]] max_ = 0 @@ -112,9 +113,10 @@ def main(): end = default_timer() print('Project Euler, Problem 11') - print('Answer: {}'.format(max_)) + print(f'Answer: {max_}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p012.py b/Python/p012.py index 24787d9..db502c7 100644 --- a/Python/p012.py +++ b/Python/p012.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # The sequence of triangle numbers is generated by adding the natural numbers. So the 7th triangle number would be 1 + 2 + 3 + 4 + 5 + 6 + 7 = 28. # The first ten terms would be: @@ -22,6 +22,7 @@ from timeit import default_timer from projecteuler import count_divisors + def main(): start = default_timer() @@ -41,9 +42,10 @@ def main(): end = default_timer() print('Project Euler, Problem 12') - print('Answer: {}'.format(triang)) + print(f'Answer: {triang}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p013.py b/Python/p013.py index 6488332..1582308 100644 --- a/Python/p013.py +++ b/Python/p013.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # Work out the first ten digits of the sum of the following one-hundred 50-digit numbers. # @@ -103,9 +103,9 @@ # 20849603980134001723930671666823555245252804609722 # 53503534226472524250874054075591789781264330331690 +from timeit import default_timer import numpy as np -from timeit import default_timer def main(): start = default_timer() @@ -219,9 +219,10 @@ def main(): end = default_timer() print('Project Euler, Problem 13') - print('Answer: {}'.format(sum_[:10])) + print(f'Answer: {sum_[:10]}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p014.py b/Python/p014.py index 0377079..2b28bf8 100644 --- a/Python/p014.py +++ b/Python/p014.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # The following iterative sequence is defined for the set of positive integers: # @@ -16,13 +16,14 @@ # # NOTE: Once the chain starts the terms are allowed to go above one million. +from timeit import default_timer from numpy import zeros -from timeit import default_timer N = 1000000 collatz_found = zeros(N, dtype=int) + # Recursive function to calculate the Collatz sequence for n. # If n is even, Collatz(n)=1+Collatz(n/2), if n is odd # Collatz(n)=1+Collatz(3*n+1). @@ -38,8 +39,8 @@ def collatz_length(n): if n % 2 == 0: return 1 + collatz_length(n//2) - else: - return 1 + collatz_length(3*n+1) + + return 1 + collatz_length(3*n+1) def main(): start = default_timer() @@ -60,9 +61,10 @@ def main(): end = default_timer() print('Project Euler, Problem 14') - print('Answer: {}'.format(max_)) + print(f'Answer: {max_}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p015.py b/Python/p015.py index 30555be..ac29472 100644 --- a/Python/p015.py +++ b/Python/p015.py @@ -1,12 +1,12 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # Starting in the top left corner of a 2×2 grid, and only being able to move to the right and down, there are exactly 6 routes to the bottom right corner # How many such routes are there through a 20×20 grid? from math import factorial - from timeit import default_timer + def main(): start = default_timer() @@ -22,9 +22,10 @@ def main(): end = default_timer() print('Project Euler, Problem 15') - print('Answer: {}'.format(count)) + print(f'Answer: {count}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p016.py b/Python/p016.py index a2556c5..1a8a69b 100644 --- a/Python/p016.py +++ b/Python/p016.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # 2^15 = 32768 and the sum of its digits is 3 + 2 + 7 + 6 + 8 = 26. # @@ -6,6 +6,7 @@ from timeit import default_timer + def main(): start = default_timer() @@ -21,9 +22,10 @@ def main(): end = default_timer() print('Project Euler, Problem 16') - print('Answer: {}'.format(sum_)) + print(f'Answer: {sum_}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p017.py b/Python/p017.py index f458b12..94d76f0 100644 --- a/Python/p017.py +++ b/Python/p017.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # If the numbers 1 to 5 are written out in words: one, two, three, four, five, then there are 3 + 3 + 5 + 4 + 4 = 19 letters used in total. # @@ -9,6 +9,7 @@ from timeit import default_timer + def main(): start = default_timer() @@ -16,10 +17,10 @@ def main(): # the second letters for "twenty", "thirty", ..., "ninety", # the third letters for "one hundred and", "two hundred and", ..., "nine hundre and", # the last one-element one the number of letters of 1000 - n_letters = [[3, 3, 5, 4, 4, 3, 5, 5, 4, 3, 6, 6, 8, 8, 7, 7, 9, 8, 8],\ - [6, 6, 5, 5, 5, 7, 6, 6],\ - [13, 13, 15, 14, 14, 13, 15, 15, 14],\ - [11]] + n_letters = [[3, 3, 5, 4, 4, 3, 5, 5, 4, 3, 6, 6, 8, 8, 7, 7, 9, 8, 8], + [6, 6, 5, 5, 5, 7, 6, 6], + [13, 13, 15, 14, 14, 13, 15, 15, 14], + [11]] sum_ = 0 @@ -59,9 +60,10 @@ def main(): end = default_timer() print('Project Euler, Problem 17') - print('Answer: {}'.format(sum_)) + print(f'Answer: {sum_}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p018.py b/Python/p018.py index b30017d..946e776 100644 --- a/Python/p018.py +++ b/Python/p018.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # By starting at the top of the triangle below and moving to adjacent numbers on the row below, the maximum total from top to bottom is 23. # @@ -30,24 +30,24 @@ # NOTE: As there are only 16384 routes, it is possible to solve this problem by trying every route. However, Problem 67, is the same challenge # with a triangle containing one-hundred rows; it cannot be solved by brute force, and requires a clever method! ;o) +import sys from timeit import default_timer + from projecteuler import find_max_path + def main(): start = default_timer() try: - fp = open('triang.txt', 'r') - except: - print('Error while opening file {}'.format('triang.txt')) - exit(1) + with open('triang.txt', 'r', encoding='utf-8') as fp: + triang = [] - triang = list() - - for line in fp: - triang.append(line.strip('\n').split()) - - fp.close() + for line in fp: + triang.append(line.strip('\n').split()) + except FileNotFoundError: + print('Error while opening file trian.txt') + sys.exit(1) l = len(triang) @@ -60,9 +60,10 @@ def main(): end = default_timer() print('Project Euler, Problem 18') - print('Answer: {}'.format(max_)) + print(f'Answer: {max_}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p019.py b/Python/p019.py index 793ac71..823d2b9 100644 --- a/Python/p019.py +++ b/Python/p019.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # You are given the following information, but you may prefer to do some research for yourself. # @@ -14,9 +14,9 @@ # How many Sundays fell on the first of the month during the twentieth century (1 Jan 1901 to 31 Dec 2000)? import datetime - from timeit import default_timer + def main(): start = default_timer() @@ -31,9 +31,10 @@ def main(): end = default_timer() print('Project Euler, Problem 19') - print('Answer: {}'.format(count)) + print(f'Answer: {count}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p020.py b/Python/p020.py index 64201d2..61eed91 100644 --- a/Python/p020.py +++ b/Python/p020.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # n! means n × (n − 1) × ... × 3 × 2 × 1 # @@ -8,9 +8,9 @@ # Find the sum of the digits in the number 100! from math import factorial - from timeit import default_timer + def main(): start = default_timer() @@ -25,9 +25,10 @@ def main(): end = default_timer() print('Project Euler, Problem 20') - print('Answer: {}'.format(sum_)) + print(f'Answer: {sum_}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p021.py b/Python/p021.py index 8726213..8693f3c 100644 --- a/Python/p021.py +++ b/Python/p021.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # Let d(n) be defined as the sum of proper divisors of n (numbers less than n which divide evenly into n). # If d(a) = b and d(b) = a, where a ≠ b, then a and b are an amicable pair and each of a and b are called amicable numbers. @@ -8,11 +8,12 @@ # # Evaluate the sum of all the amicable numbers under 10000. -from math import floor, sqrt from timeit import default_timer + from projecteuler import sum_of_divisors + def main(): start = default_timer() @@ -32,9 +33,10 @@ def main(): end = default_timer() print('Project Euler, Problem 21') - print('Answer: {}'.format(sum_)) + print(f'Answer: {sum_}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p022.py b/Python/p022.py index 4709576..11af82d 100644 --- a/Python/p022.py +++ b/Python/p022.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # Using names.txt, a 46K text file containing over five-thousand first names, begin by sorting it into alphabetical order. # Then working out the alphabetical value for each name, multiply this value by its alphabetical position in the list to obtain a name score. @@ -8,18 +8,20 @@ # # What is the total of all the name scores in the file? +import sys from timeit import default_timer + def main(): start = default_timer() try: - fp = open('names.txt', 'r') - except: - print('Error while opening file {}'.format('names.txt')) - exit(1) + with open('names.txt', 'r', encoding='utf-8') as fp: + names = list(fp.readline().replace('"', '').split(',')) + except FileNotFoundError: + print('Error while opening file names.txt') + sys.exit(1) - names = list(fp.readline().replace('"', '').split(',')) names.sort() sum_ = 0 @@ -38,9 +40,10 @@ def main(): end = default_timer() print('Project Euler, Problem 22') - print('Answer: {}'.format(sum_)) + print(f'Answer: {sum_}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p023.py b/Python/p023.py index 0d7bd54..be364ea 100644 --- a/Python/p023.py +++ b/Python/p023.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # A perfect number is a number for which the sum of its proper divisors is exactly equal to the number. # For example, the sum of the proper divisors of 28 would be 1 + 2 + 4 + 7 + 14 = 28, which means that 28 is a perfect number. @@ -12,14 +12,15 @@ # # Find the sum of all the positive integers which cannot be written as the sum of two abundant numbers. -from math import floor, sqrt - from timeit import default_timer + from projecteuler import sum_of_divisors + def is_abundant(n): return sum_of_divisors(n) > n + def main(): start = default_timer() @@ -52,9 +53,10 @@ def main(): end = default_timer() print('Project Euler, Problem 23') - print('Answer: {}'.format(sum_)) + print(f'Answer: {sum_}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p024.py b/Python/p024.py index 2674bb1..ab723e6 100644 --- a/Python/p024.py +++ b/Python/p024.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # A permutation is an ordered arrangement of objects. For example, 3124 is one possible permutation of the digits 1, 2, 3 and 4. # If all of the permutations are listed numerically or alphabetically, we call it lexicographic order. The lexicographic permutations of 0, 1 and 2 are: @@ -8,9 +8,9 @@ # What is the millionth lexicographic permutation of the digits 0, 1, 2, 3, 4, 5, 6, 7, 8 and 9? from itertools import permutations - from timeit import default_timer + def main(): start = default_timer() @@ -21,9 +21,10 @@ def main(): end = default_timer() print('Project Euler, Problem 24') - print('Answer: {}'.format(res)) + print(f'Answer: {res}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p025.py b/Python/p025.py index 12174f8..4791a6b 100644 --- a/Python/p025.py +++ b/Python/p025.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # The Fibonacci sequence is defined by the recurrence relation: # @@ -23,6 +23,7 @@ from timeit import default_timer + def main(): start = default_timer() @@ -42,9 +43,10 @@ def main(): end = default_timer() print('Project Euler, Problem 25') - print('Answer: {}'.format(i)) + print(f'Answer: {i}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p026.py b/Python/p026.py index 42a895c..91cd636 100644 --- a/Python/p026.py +++ b/Python/p026.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # A unit fraction contains 1 in the numerator. The decimal representation of the unit fractions with denominators 2 to 10 are given: # @@ -18,6 +18,7 @@ from timeit import default_timer + def main(): start = default_timer() @@ -59,9 +60,10 @@ def main(): end = default_timer() print('Project Euler, Problem 26') - print('Answer: {}'.format(max_n)) + print(f'Answer: {max_n}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p027.py b/Python/p027.py index 05dd5b1..b093c6f 100644 --- a/Python/p027.py +++ b/Python/p027.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # Euler discovered the remarkable quadratic formula: # @@ -20,8 +20,10 @@ # Find the product of the coefficients, a and b, for the quadratic expression that produces the maximum number of primes for consecutive values of n, starting with n=0. from timeit import default_timer + from projecteuler import is_prime + def main(): start = default_timer() @@ -52,9 +54,10 @@ def main(): end = default_timer() print('Project Euler, Problem 27') - print('Answer: {}'.format(save_a * save_b)) + print(f'Answer: {save_a * save_b}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p028.py b/Python/p028.py index 60d0b03..8984cd4 100644 --- a/Python/p028.py +++ b/Python/p028.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # Starting with the number 1 and moving to the right in a clockwise direction a 5 by 5 spiral is formed as follows: # @@ -14,6 +14,7 @@ from timeit import default_timer + def main(): start = default_timer() @@ -40,9 +41,10 @@ def main(): end = default_timer() print('Project Euler, Problem 28') - print('Answer: {}'.format(sum_)) + print(f'Answer: {sum_}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p029.py b/Python/p029.py index 34bb6b2..8396d0e 100644 --- a/Python/p029.py +++ b/Python/p029.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # Consider all integer combinations of ab for 2 ≤ a ≤ 5 and 2 ≤ b ≤ 5: # @@ -13,9 +13,10 @@ # # How many distinct terms are in the sequence generated by ab for 2 ≤ a ≤ 100 and 2 ≤ b ≤ 100? +from timeit import default_timer + from numpy import zeros -from timeit import default_timer def main(): start = default_timer() @@ -31,7 +32,7 @@ def main(): # Sort the values and count the different values. powers = list(powers) powers.sort() - + count = 1 for i in range(1, 9801): @@ -41,9 +42,10 @@ def main(): end = default_timer() print('Project Euler, Problem 29') - print('Answer: {}'.format(count)) + print(f'Answer: {count}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p030.py b/Python/p030.py index 5bf0bbd..a91e0bc 100644 --- a/Python/p030.py +++ b/Python/p030.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # Surprisingly there are only three numbers that can be written as the sum of fourth powers of their digits: # @@ -14,6 +14,7 @@ from timeit import default_timer + def main(): start = default_timer() @@ -37,9 +38,10 @@ def main(): end = default_timer() print('Project Euler, Problem 30') - print('Answer: {}'.format(tot)) + print(f'Answer: {tot}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p031.py b/Python/p031.py index b160183..25981e6 100644 --- a/Python/p031.py +++ b/Python/p031.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # In England the currency is made up of pound, £, and pence, p, and there are eight coins in general circulation: # @@ -12,20 +12,23 @@ from timeit import default_timer + # Simple recursive function that tries every combination. def count(coins, value, n, i): for j in range(i, 8): value = value + coins[j] if value == 200: return n + 1 - elif value > 200: + + if value > 200: return n - else: - n = count(coins, value, n, j) - value = value - coins[j] + + n = count(coins, value, n, j) + value = value - coins[j] return n + def main(): start = default_timer() @@ -36,9 +39,10 @@ def main(): end = default_timer() print('Project Euler, Problem 31') - print('Answer: {}'.format(n)) + print(f'Answer: {n}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p032.py b/Python/p032.py index 76c7411..1c16343 100644 --- a/Python/p032.py +++ b/Python/p032.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # We shall say that an n-digit number is pandigital if it makes use of all the digits 1 to n exactly once; for example, the 5-digit number, 15234, # is 1 through 5 pandigital. @@ -9,12 +9,14 @@ # # HINT: Some products can be obtained in more than one way so be sure to only include it once in your sum. +from timeit import default_timer + import numpy as np from numpy import zeros -from timeit import default_timer from projecteuler import is_pandigital + def main(): start = default_timer() @@ -26,14 +28,14 @@ def main(): # To get a 1 to 9 pandigital concatenation of the two factors and product, # we need to multiply a 1 digit number times a 4 digit numbers (the biggest # one digit number 9 times the biggest 3 digit number 999 multiplied give -# 8991 and the total digit count is 8, which is not enough), or a 2 digit +# 8991 and the total digit count is 8, which is not enough), or a 2 digit # number times a 3 digit number (the smallest two different 3 digits number, # 100 and 101, multiplied give 10100, and the total digit count is 11, which # is too many). The outer loop starts at 2 because 1 times any number gives -# the same number, so its digit will be repeated and the result can't be -# pandigital. The nested loop starts from 1234 because it's the smallest +# the same number, so its digit will be repeated and the result can't be +# pandigital. The nested loop starts from 1234 because it's the smallest # 4-digit number with no repeated digits, and it ends at 4987 because it's -# the biggest number without repeated digits that multiplied by 2 gives a +# the biggest number without repeated digits that multiplied by 2 gives a # 4 digit number. for i in range(2, 9): for j in range(1234, 4987): @@ -80,9 +82,10 @@ def main(): end = default_timer() print('Project Euler, Problem 32') - print('Answer: {}'.format(sum_)) + print(f'Answer: {sum_}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p033.py b/Python/p033.py index 72ac514..01870b4 100644 --- a/Python/p033.py +++ b/Python/p033.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # The fraction 49/98 is a curious fraction, as an inexperienced mathematician in attempting to simplify it may incorrectly believe that 49/98 = 4/8, # which is correct, is obtained by cancelling the 9s. @@ -11,9 +11,9 @@ # If the product of these four fractions is given in its lowest common terms, find the value of the denominator. from math import gcd - from timeit import default_timer + def main(): start = default_timer() @@ -25,7 +25,7 @@ def main(): # If the example is non-trivial, check if cancelling the digit that's equal # in numerator and denominator gives the same fraction. if i % 10 != 0 and j % 10 != 0 and\ - i != j and i % 10 == j // 10: + i != j and i % 10 == j // 10: n = i // 10 d = j % 10 @@ -42,9 +42,10 @@ def main(): end = default_timer() print('Project Euler, Problem 33') - print('Answer: {}'.format(prod_d // div)) + print(f'Answer: {prod_d // div}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p034.py b/Python/p034.py index 6b9e392..fd7fd9a 100644 --- a/Python/p034.py +++ b/Python/p034.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # 145 is a curious number, as 1! + 4! + 5! = 1 + 24 + 120 = 145. # @@ -7,10 +7,10 @@ # Note: as 1! = 1 and 2! = 2 are not sums they are not included. from math import factorial +from timeit import default_timer from numpy import ones -from timeit import default_timer def main(): start = default_timer() @@ -41,9 +41,10 @@ def main(): end = default_timer() print('Project Euler, Problem 34') - print('Answer: {}'.format(sum_)) + print(f'Answer: {sum_}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p035.py b/Python/p035.py index 307c3b3..6f4e5dd 100644 --- a/Python/p035.py +++ b/Python/p035.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # The number, 197, is called a circular prime because all rotations of the digits: 197, 971, and 719, are themselves prime. # @@ -7,18 +7,23 @@ # How many circular primes are there below one million? from timeit import default_timer + from projecteuler import sieve -def is_circular_prime(n): - global primes +# Calculate all primes below one million, then check if they're circular. +N = 1000000 +primes = sieve(N) + + +def is_circular_prime(n): # If n is not prime, it's obviously not a circular prime. if primes[n] == 0: return False # The primes below 10 are circular primes. if primes[n] == 1 and n < 10: - return True + return True tmp = n count = 0 @@ -32,7 +37,7 @@ def is_circular_prime(n): count = count + 1 tmp = tmp // 10 - for i in range(1, count): + for _ in range(1, count): # Generate rotations and check if they're prime. n = n % (10 ** (count - 1)) * 10 + n // (10 ** (count - 1)) @@ -41,15 +46,10 @@ def is_circular_prime(n): return True + def main(): start = default_timer() - global primes - - N = 1000000 - -# Calculate all primes below one million, then check if they're circular. - primes = sieve(N) count = 13 # Calculate all primes below one million, then check if they're circular. @@ -60,9 +60,10 @@ def main(): end = default_timer() print('Project Euler, Problem 35') - print('Answer: {}'.format(count)) + print(f'Answer: {count}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p036.py b/Python/p036.py index 47a1713..eeb0138 100644 --- a/Python/p036.py +++ b/Python/p036.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # The decimal number, 585 = 1001001001_2 (binary), is palindromic in both bases. # @@ -7,8 +7,10 @@ # (Please note that the palindromic number, in either base, may not include leading zeros.) from timeit import default_timer + from projecteuler import is_palindrome + def main(): start = default_timer() @@ -26,9 +28,10 @@ def main(): end = default_timer() print('Project Euler, Problem 36') - print('Answer: {}'.format(sum_)) + print(f'Answer: {sum_}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p037.py b/Python/p037.py index f7bec24..d0e3cdc 100644 --- a/Python/p037.py +++ b/Python/p037.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # The number 3797 has an interesting property. Being prime itself, it is possible to continuously remove digits from left to right, # and remain prime at each stage: 3797, 797, 97, and 7. Similarly we can work from right to left: 3797, 379, 37, and 3. @@ -8,8 +8,10 @@ # NOTE: 2, 3, 5, and 7 are not considered to be truncatable primes. from timeit import default_timer + from projecteuler import is_prime + def is_tr_prime(n): # One-digit numbers and non-prime numbers are # not truncatable primes. @@ -40,6 +42,7 @@ def is_tr_prime(n): # If it gets here, the number is truncatable prime. return True + def main(): start = default_timer() @@ -57,9 +60,10 @@ def main(): end = default_timer() print('Project Euler, Problem 37') - print('Answer: {}'.format(sum_)) + print(f'Answer: {sum_}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p038.py b/Python/p038.py index f8804c0..f22efa1 100644 --- a/Python/p038.py +++ b/Python/p038.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # Take the number 192 and multiply it by each of 1, 2, and 3: # @@ -13,11 +13,11 @@ # # What is the largest 1 to 9 pandigital 9-digit number that can be formed as the concatenated product of an integer with (1,2, ... , n) where n > 1? -from numpy import zeros - from timeit import default_timer + from projecteuler import is_pandigital + def main(): start = default_timer() @@ -57,9 +57,10 @@ def main(): end = default_timer() print('Project Euler, Problem 38') - print('Answer: {}'.format(max_)) + print(f'Answer: {max_}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p039.py b/Python/p039.py index 906f051..4946387 100644 --- a/Python/p039.py +++ b/Python/p039.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # If p is the perimeter of a right angle triangle with integral length sides, {a,b,c}, there are exactly three solutions for p = 120. # @@ -6,9 +6,10 @@ # # For which value of p ≤ 1000, is the number of solutions maximised? +from timeit import default_timer + from numpy import zeros -from timeit import default_timer def main(): start = default_timer() @@ -68,9 +69,10 @@ def main(): end = default_timer() print('Project Euler, Problem 39') - print('Answer: {}'.format(res)) + print(f'Answer: {res}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p040.py b/Python/p040.py index 95ff515..215be92 100644 --- a/Python/p040.py +++ b/Python/p040.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # An irrational decimal fraction is created by concatenating the positive integers: # @@ -10,9 +10,10 @@ # # d_1 × d_10 × d_100 × d_1000 × d_10000 × d_100000 × d_1000000 +from timeit import default_timer + from numpy import zeros -from timeit import default_timer def main(): start = default_timer() @@ -66,9 +67,10 @@ def main(): end = default_timer() print('Project Euler, Problem 40') - print('Answer: {}'.format(n)) + print(f'Answer: {n}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p041.py b/Python/p041.py index dab0a7e..d15cb6b 100644 --- a/Python/p041.py +++ b/Python/p041.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # We shall say that an n-digit number is pandigital if it makes use of all the digits 1 to n exactly once. For example, 2143 is a 4-digit pandigital # and is also prime. @@ -6,8 +6,10 @@ # What is the largest n-digit pandigital prime that exists? from timeit import default_timer + from projecteuler import is_pandigital, is_prime + def main(): start = default_timer() @@ -18,18 +20,19 @@ def main(): # until we find a prime. i = 7654321 - while(i > 0): + while i > 0: if is_pandigital(i, len(str(i))) and is_prime(i): break # Skipping the even numbers. i = i - 2 - + end = default_timer() print('Project Euler, Problem 41') - print('Answer: {}'.format(i)) - - print('Elapsed time: {:.9f} seconds'.format(end - start)) + print(f'Answer: {i}') + + print(f'Elapsed time: {end - start:.9f} seconds') + if __name__ == '__main__': main() diff --git a/Python/p042.py b/Python/p042.py index 80048ab..189fcf2 100644 --- a/Python/p042.py +++ b/Python/p042.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # The nth term of the sequence of triangle numbers is given by, tn = ½n(n+1); so the first ten triangle numbers are: # @@ -10,8 +10,10 @@ # Using words.txt (right click and 'Save Link/Target As...'), a 16K text file containing nearly two-thousand common English words, # how many are triangle words? +import sys from timeit import default_timer + def is_triang(n): i = 1 j = 1 @@ -24,18 +26,16 @@ def is_triang(n): return False + def main(): start = default_timer() try: - fp = open('words.txt', 'r') - except: - print('Error while opening file {}'.format('words.txt')) - exit(1) - - words = list(fp.readline().replace('"', '').split(',')) - - fp.close() + with open('words.txt', 'r', encoding='utf-8') as fp: + words = list(fp.readline().replace('"', '').split(',')) + except FileNotFoundError: + print('Error while opening file words.txt') + sys.exit(1) count = 0 @@ -53,9 +53,10 @@ def main(): end = default_timer() print('Project Euler, Problem 42') - print('Answer: {}'.format(count)) + print(f'Answer: {count}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p043.py b/Python/p043.py index 9669192..f7621f0 100644 --- a/Python/p043.py +++ b/Python/p043.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # The number, 1406357289, is a 0 to 9 pandigital number because it is made up of each of the digits 0 to 9 in some order, but it also has a # rather interesting sub-string divisibility property. @@ -16,9 +16,9 @@ # Find the sum of all 0 to 9 pandigital numbers with this property. from itertools import permutations - from timeit import default_timer + # Function to check if the value has the desired property. def has_property(n): value = int(n[1]) * 100 + int(n[2]) * 10 + int(n[3]) @@ -50,7 +50,7 @@ def has_property(n): if value % 13 != 0: return False - + value = int(n[7]) * 100 + int(n[8]) * 10 + int(n[9]) if value % 17 != 0: @@ -58,6 +58,7 @@ def has_property(n): return True + def main(): start = default_timer() @@ -74,9 +75,10 @@ def main(): end = default_timer() print('Project Euler, Problem 43') - print('Answer: {}'.format(sum_)) + print(f'Answer: {sum_}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p044.py b/Python/p044.py index 7b4c961..b348d9c 100644 --- a/Python/p044.py +++ b/Python/p044.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # Pentagonal numbers are generated by the formula, Pn=n(3n−1)/2. The first ten pentagonal numbers are: # @@ -9,11 +9,11 @@ # Find the pair of pentagonal numbers, Pj and Pk, for which their sum and difference are pentagonal and D = |Pk − Pj| is minimised; # what is the value of D? -from math import sqrt - from timeit import default_timer + from projecteuler import is_pentagonal + def main(): start = default_timer() @@ -38,9 +38,10 @@ def main(): end = default_timer() print('Project Euler, Problem 44') - print('Answer: {}'.format(pn-pm)) + print(f'Answer: {pn - pm}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p045.py b/Python/p045.py index a1dedef..cad8098 100644 --- a/Python/p045.py +++ b/Python/p045.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # Triangle, pentagonal, and hexagonal numbers are generated by the following formulae: # @@ -10,11 +10,11 @@ # # Find the next triangle number that is also pentagonal and hexagonal. -from math import sqrt - from timeit import default_timer + from projecteuler import is_pentagonal + def main(): start = default_timer() @@ -34,9 +34,10 @@ def main(): end = default_timer() print('Project Euler, Problem 45') - print('Answer: {}'.format(n)) + print(f'Answer: {n}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p046.py b/Python/p046.py index a249a92..ab391b2 100644 --- a/Python/p046.py +++ b/Python/p046.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # It was proposed by Christian Goldbach that every odd composite number can be written as the sum of a prime and twice a square. # @@ -14,11 +14,15 @@ # What is the smallest odd composite that cannot be written as the sum of a prime and twice a square? from timeit import default_timer + from projecteuler import sieve -def goldbach(n): - global primes +N = 10000 +primes = sieve(N) + + +def goldbach(n): # Check every prime smaller than n. for i in range(3, n, 2): if primes[i] == 1: @@ -43,12 +47,6 @@ def goldbach(n): def main(): start = default_timer() - global primes - - N = 10000 - - primes = sieve(N) - found = 0 i = 3 @@ -64,9 +62,10 @@ def main(): end = default_timer() print('Project Euler, Problem 46') - print('Answer: {}'.format(i-2)) + print(f'Answer: {i - 2}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p047.py b/Python/p047.py index fdb0ff3..ca072dd 100644 --- a/Python/p047.py +++ b/Python/p047.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # The first two consecutive numbers to have two distinct prime factors are: # @@ -15,6 +15,7 @@ from timeit import default_timer + # Function using a modified sieve of Eratosthenes to count # the distinct prime factors of each number. def count_factors(n): @@ -29,6 +30,7 @@ def count_factors(n): return factors + def main(): start = default_timer() @@ -53,9 +55,10 @@ def main(): end = default_timer() print('Project Euler, Problem 47') - print('Answer: {}'.format(res)) + print(f'Answer: {res}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p048.py b/Python/p048.py index c830a49..2fdf0a5 100644 --- a/Python/p048.py +++ b/Python/p048.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # The series, 1^1 + 2^2 + 3^3 + ... + 10^10 = 10405071317. # @@ -6,6 +6,7 @@ from timeit import default_timer + def main(): start = default_timer() @@ -19,9 +20,10 @@ def main(): end = default_timer() print('Project Euler, Problem 48') - print('Answer: {}'.format(str(sum_)[-10:])) + print(f'Answer: {str(sum_)[-10:]}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p049.py b/Python/p049.py index a7bdb78..cf5d76e 100644 --- a/Python/p049.py +++ b/Python/p049.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # The arithmetic sequence, 1487, 4817, 8147, in which each of the terms increases by 3330, is unusual in two ways: (i) each of the three terms are prime, # and, (ii) each of the 4-digit numbers are permutations of one another. @@ -8,11 +8,11 @@ # # What 12-digit number do you form by concatenating the three terms in this sequence? -from numpy import zeros - from timeit import default_timer + from projecteuler import sieve + def main(): start = default_timer() @@ -35,18 +35,20 @@ def main(): if i + 2 * j < N and primes[i+j] == 1 and primes[i+2*j] == 1 and\ ''.join(sorted(str(i))) == ''.join(sorted(str(i+j))) and\ ''.join(sorted(str(i))) == ''.join(sorted(str(i+2*j))): - found = 1 - break - if(found): + found = 1 + break + if found: break + i = i + 2 end = default_timer() print('Project Euler, Problem 49') - print('Answer: {}'.format(str(i)+str(i+j)+str(i+2*j))) + print(f'Answer: {str(i)+str(i+j)+str(i+2*j)}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p050.py b/Python/p050.py index ca828ab..ba17739 100644 --- a/Python/p050.py +++ b/Python/p050.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # The prime 41, can be written as the sum of six consecutive primes: # @@ -11,8 +11,10 @@ # Which prime, below one-million, can be written as the sum of the most consecutive primes? from timeit import default_timer + from projecteuler import sieve + def main(): start = default_timer() @@ -64,9 +66,10 @@ def main(): end = default_timer() print('Project Euler, Problem 50') - print('Answer: {}'.format(max_p)) + print(f'Answer: {max_p}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p051.py b/Python/p051.py index 74dc830..1c5132f 100644 --- a/Python/p051.py +++ b/Python/p051.py @@ -10,8 +10,16 @@ # value family. from timeit import default_timer + from projecteuler import sieve + +N = 1000000 + +# N set to 1000000 as a reasonable limit, which turns out to be enough. +primes = sieve(N) + + def count_digit(n, d): count = 0 @@ -22,9 +30,8 @@ def count_digit(n, d): return count -def replace(n): - global primes +def replace(n): n_string = list(str(n)) l = len(n_string) max_ = 0 @@ -60,35 +67,29 @@ def replace(n): def main(): start = default_timer() - global primes - - N = 1000000 - -# N set to 1000000 as a reasonable limit, which turns out to be enough. - primes = sieve(N) - # Checking only odd numbers with at least 4 digits. i = 1001 while i < N: -# The family of numbers needs to have at least one of 0, 1 or 2 as -# repeated digits, otherwise we can't get a 8 number family (there +# The family of numbers needs to have at least one of 0, 1 or 2 as +# repeated digits, otherwise we can't get a 8 number family (there # are only 7 other digits). Also, te number of repeated digits must # be 3, otherwise at least 3 resulting numbers will be divisible by 3. # So the smallest number of this family must have three 0s, three 1s or # three 2s. if count_digit(i, 0) >= 3 or count_digit(i, 1) >= 3 or\ count_digit(i, 2) >= 3: - if primes[i] == 1 and replace(i) == 8: - break + if primes[i] == 1 and replace(i) == 8: + break i = i + 2 - + end = default_timer() print('Project Euler, Problem 51') - print('Answer: {}'.format(i)) + print(f'Answer: {i}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p052.py b/Python/p052.py index f51d063..27a338e 100644 --- a/Python/p052.py +++ b/Python/p052.py @@ -4,10 +4,9 @@ # # Find the smallest positive integer, x, such that 2x, 3x, 4x, 5x, and 6x, contain the same digits. -from numpy import zeros - from timeit import default_timer + def main(): start = default_timer() @@ -20,15 +19,16 @@ def main(): ''.join(sorted(str(i))) == ''.join(sorted(str(4*i))) and\ ''.join(sorted(str(i))) == ''.join(sorted(str(5*i))) and\ ''.join(sorted(str(i))) == ''.join(sorted(str(6*i))): - break + break i = i + 1 - + end = default_timer() print('Project Euler, Problem 52') - print('Answer: {}'.format(i)) + print(f'Answer: {i}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p053.py b/Python/p053.py index a4584bd..25bd95a 100644 --- a/Python/p053.py +++ b/Python/p053.py @@ -12,9 +12,10 @@ # # How many, not necessarily distinct, values of (n r) for 1≤n≤100, are greater than one-million? +from timeit import default_timer + from scipy.special import comb -from timeit import default_timer def main(): start = default_timer() @@ -32,9 +33,10 @@ def main(): end = default_timer() print('Project Euler, Problem 53') - print('Answer: {}'.format(count)) + print(f'Answer: {count}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p054.py b/Python/p054.py index 798f6bc..055afc7 100644 --- a/Python/p054.py +++ b/Python/p054.py @@ -46,10 +46,11 @@ # # How many hands does Player 1 win? +import sys from enum import IntEnum - from timeit import default_timer + class Value(IntEnum): Two = 1 Three = 2 @@ -65,10 +66,11 @@ class Value(IntEnum): King = 12 Ace = 13 + class Card(): def __init__(self, *args, **kwargs): - super(Card, self).__init__(*args, **kwargs) + super().__init__(*args, **kwargs) self.value = None self.suit = None @@ -103,20 +105,22 @@ class Card(): self.suit = card[1] + class Hand(): def __init__(self, *args, **kwargs): - super(Hand, self).__init__(*args, **kwargs) + super().__init__(*args, **kwargs) self.cards = list() def sort(self): self.cards.sort(key=lambda x: x.value) + class Game(): def __init__(self, *args, **kwargs): - super(Game, self).__init__(*args, **kwargs) + super().__init__(*args, **kwargs) self.hand1 = None self.hand2 = None @@ -130,7 +134,8 @@ class Game(): self.hand1.cards[0].suit == self.hand1.cards[2].suit and\ self.hand1.cards[0].suit == self.hand1.cards[3].suit and\ self.hand1.cards[0].suit == self.hand1.cards[4].suit: - return 1 + return 1 + # If player 2 has a Royal Flush, player 2 wins. if self.hand2.cards[4].value == Value.Ace and self.hand2.cards[3].value == Value.King and\ self.hand2.cards[2].value == Value.Queen and self.hand2.cards[1].value == Value.Jack and\ @@ -138,7 +143,7 @@ class Game(): self.hand2.cards[0].suit == self.hand2.cards[2].suit and\ self.hand2.cards[0].suit == self.hand2.cards[3].suit and\ self.hand2.cards[0].suit == self.hand2.cards[4].suit: - return -1 + return -1 straightflush1 = 0 straightflush2 = 0 @@ -146,35 +151,35 @@ class Game(): # Check if player 1 has a straight flush. if self.hand1.cards[0].suit == self.hand1.cards[1].suit and self.hand1.cards[0].suit == self.hand1.cards[2].suit and\ self.hand1.cards[0].suit == self.hand1.cards[3].suit and self.hand1.cards[0].suit == self.hand1.cards[4].suit: - value = self.hand1.cards[0].value + value = self.hand1.cards[0].value - straightflush1 = 1 + straightflush1 = 1 - for i in range(1, 5): - value = value + 1 + for i in range(1, 5): + value = value + 1 - if self.hand1.cards[i].value != value: - straightflush1 = 0 - break + if self.hand1.cards[i].value != value: + straightflush1 = 0 + break # Check if player 2 has a straight flush. if self.hand2.cards[0].suit == self.hand2.cards[1].suit and self.hand2.cards[0].suit == self.hand2.cards[2].suit and\ self.hand2.cards[0].suit == self.hand2.cards[3].suit and self.hand2.cards[0].suit == self.hand2.cards[4].suit: - value = self.hand2.cards[0].value + value = self.hand2.cards[0].value - straightflush2 = 1 + straightflush2 = 1 - for i in range(1, 5): - value = value + 1 + for i in range(1, 5): + value = value + 1 - if self.hand2.cards[i].value != value: - straightflush2 = 0 - break + if self.hand2.cards[i].value != value: + straightflush2 = 0 + break # If player 1 has a straight flush and player 2 doesn't, player 1 wins if straightflush1 and not straightflush2: return 1 - + # If player 2 has a straight flush and player 1 doesn't, player 2 wins if not straightflush1 and straightflush2: return -1 @@ -185,8 +190,8 @@ class Game(): if straightflush1 and straightflush2: if self.hand1.cards[0].value > self.hand2.cards[0].value: return 1 - else: - return -1 + + return -1 four1 = 0 four2 = 0 @@ -221,12 +226,12 @@ class Game(): # Check if player 1 has a full house. if self.hand1.cards[0].value == self.hand1.cards[1].value and self.hand1.cards[3].value == self.hand1.cards[4].value and\ (self.hand1.cards[1].value == self.hand1.cards[2].value or self.hand1.cards[2].value == self.hand1.cards[3].value): - full1 = 1 + full1 = 1 # Check if player 2 has a full house. if self.hand2.cards[0].value == self.hand2.cards[1].value and self.hand2.cards[3].value == self.hand2.cards[4].value and\ (self.hand2.cards[1].value == self.hand2.cards[2].value or self.hand2.cards[2].value == self.hand2.cards[3].value): - full2 = 1 + full2 = 1 # If player 1 has a full house and player 2 doesn't, player 1 wins. if full1 and not full2: @@ -242,7 +247,8 @@ class Game(): if full1 and full2: if self.hand1.cards[2].value > self.hand2.cards[2].value: return 1 - elif self.hand1.cards[2].value < self.hand2.cards[2].value: + + if self.hand1.cards[2].value < self.hand2.cards[2].value: return -1 flush1 = 0 @@ -251,12 +257,12 @@ class Game(): # Check if player 1 has a flush. if self.hand1.cards[0].suit == self.hand1.cards[1].suit and self.hand1.cards[0].suit == self.hand1.cards[2].suit and\ self.hand1.cards[0].suit == self.hand1.cards[3].suit and self.hand1.cards[0].suit == self.hand1.cards[4].suit: - flush1 = 1 + flush1 = 1 # Check if player 2 has a flush. if self.hand2.cards[0].suit == self.hand2.cards[1].suit and self.hand2.cards[0].suit == self.hand2.cards[2].suit and\ self.hand2.cards[0].suit == self.hand2.cards[3].suit and self.hand2.cards[0].suit == self.hand2.cards[4].suit: - flush2 = 1 + flush2 = 1 # If player 1 has a flush and player 2 doesn't, player 1 wins. if flush1 and not flush2: @@ -304,13 +310,13 @@ class Game(): if (self.hand1.cards[0].value == self.hand1.cards[1].value and self.hand1.cards[0].value == self.hand1.cards[2].value) or\ (self.hand1.cards[1].value == self.hand1.cards[2].value and self.hand1.cards[1].value == self.hand1.cards[3].value) or\ (self.hand1.cards[2].value == self.hand1.cards[3].value and self.hand1.cards[2].value == self.hand1.cards[4].value): - three1 = 1 + three1 = 1 # Check if player 2 has three of a kind. if (self.hand2.cards[0].value == self.hand2.cards[1].value and self.hand2.cards[0].value == self.hand2.cards[2].value) or\ (self.hand2.cards[1].value == self.hand2.cards[2].value and self.hand2.cards[1].value == self.hand2.cards[3].value) or\ (self.hand2.cards[2].value == self.hand2.cards[3].value and self.hand2.cards[2].value == self.hand2.cards[4].value): - three2 = 1 + three2 = 1 # If player 1 has three of a kind and player 2 doesn't, player 1 wins. if three1 and not three2: @@ -323,7 +329,8 @@ class Game(): if three1 and three2: if self.hand1.cards[2].value > self.hand2.cards[2].value: return 1 - elif self.hand1.cards[2].value < self.hand2.cards[2].value: + + if self.hand1.cards[2].value < self.hand2.cards[2].value: return -1 twopairs1 = 0 @@ -333,13 +340,13 @@ class Game(): if (self.hand1.cards[0].value == self.hand1.cards[1].value and self.hand1.cards[2].value == self.hand1.cards[3].value) or\ (self.hand1.cards[0].value == self.hand1.cards[1].value and self.hand1.cards[3].value == self.hand1.cards[4].value) or\ (self.hand1.cards[1].value == self.hand1.cards[2].value and self.hand1.cards[3].value == self.hand1.cards[4].value): - twopairs1 = 1 + twopairs1 = 1 # Check if player 2 has two pairs. if (self.hand2.cards[0].value == self.hand2.cards[1].value and self.hand2.cards[2].value == self.hand2.cards[3].value) or\ (self.hand2.cards[0].value == self.hand2.cards[1].value and self.hand2.cards[3].value == self.hand2.cards[4].value) or\ (self.hand2.cards[1].value == self.hand2.cards[2].value and self.hand2.cards[3].value == self.hand2.cards[4].value): - twopairs2 = 1 + twopairs2 = 1 # If player 1 has two pairs and player 2 doesn't, player 1 wins. if twopairs1 and not twopairs2: @@ -354,17 +361,21 @@ class Game(): if twopairs1 and twopairs2: if self.hand1.cards[3].value > self.hand2.cards[3].value: return 1 - elif self.hand1.cards[3].value < self.hand2.cards[3].value: + + if self.hand1.cards[3].value < self.hand2.cards[3].value: return -1 - elif self.hand1.cards[1].value > self.hand2.cards[1].value: + + if self.hand1.cards[1].value > self.hand2.cards[1].value: return 1 - elif self.hand1.cards[1].value < self.hand2.cards[1].value: + + if self.hand1.cards[1].value < self.hand2.cards[1].value: return -1 for i in range(4, -1, -1): if self.hand1.cards[i].value > self.hand2.cards[i].value: return 1 - elif self.hand1.cards[i].value < self.hand2.cards[i].value: + + if self.hand1.cards[i].value < self.hand2.cards[i].value: return -1 pair1 = 0 @@ -373,12 +384,12 @@ class Game(): # Check if player 1 has a pair of cards. if self.hand1.cards[0].value == self.hand1.cards[1].value or self.hand1.cards[1].value == self.hand1.cards[2].value or\ self.hand1.cards[2].value == self.hand1.cards[3].value or self.hand1.cards[3].value == self.hand1.cards[4].value: - pair1 = 1 + pair1 = 1 # Check if player 2 has a pair of cards. if self.hand2.cards[0].value == self.hand2.cards[1].value or self.hand2.cards[1].value == self.hand2.cards[2].value or\ self.hand2.cards[2].value == self.hand2.cards[3].value or self.hand2.cards[3].value == self.hand2.cards[4].value: - pair2 = 1 + pair2 = 1 # If player 1 has a pair of cards and player 2 doesn't, player 1 wins. if pair1 and not pair2: @@ -427,22 +438,20 @@ class Game(): return 1 if self.hand1.cards[i].value < self.hand2.cards[i].value: return -1 - + # If everything is equal, return 0 return 0 + def main(): start = default_timer() try: - fp = open('poker.txt', 'r') - except: - print('Error while opening file {}'.format('poker.txt')) - exit(1) - - games = fp.readlines() - - fp.close() + with open('poker.txt', 'r', encoding='utf-8') as fp: + games = fp.readlines() + except FileNotFoundError: + print('Error while opening file poker.txt') + sys.exit(1) count = 0 @@ -478,9 +487,10 @@ def main(): end = default_timer() print('Project Euler, Problem 54') - print('Answer: {}'.format(count)) + print(f'Answer: {count}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p055.py b/Python/p055.py index 501ecf3..52a0602 100644 --- a/Python/p055.py +++ b/Python/p055.py @@ -24,13 +24,15 @@ # NOTE: Wording was modified slightly on 24 April 2007 to emphasise the theoretical nature of Lychrel numbers. from timeit import default_timer + from projecteuler import is_palindrome + def is_lychrel(n): tmp = n # Run for 50 iterations - for i in range(50): + for _ in range(50): reverse = 0 # Find the reverse of the given number @@ -50,6 +52,7 @@ def is_lychrel(n): return True + def main(): start = default_timer() @@ -64,9 +67,10 @@ def main(): end = default_timer() print('Project Euler, Problem 55') - print('Answer: {}'.format(count)) + print(f'Answer: {count}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p056.py b/Python/p056.py index 4bbe897..2252c32 100644 --- a/Python/p056.py +++ b/Python/p056.py @@ -7,6 +7,7 @@ from timeit import default_timer + def main(): start = default_timer() @@ -28,9 +29,10 @@ def main(): end = default_timer() print('Project Euler, Problem 56') - print('Answer: {}'.format(max_)) + print(f'Answer: {max_}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p057.py b/Python/p057.py index 7f9e681..5297bda 100644 --- a/Python/p057.py +++ b/Python/p057.py @@ -18,6 +18,7 @@ from timeit import default_timer + def main(): start = default_timer() @@ -27,10 +28,10 @@ def main(): # If n/d is the current term of the expansion, the next term can be calculated as # (n+2d)/(n+d). - for i in range(1, 1000): + for _ in range(1, 1000): d2 = 2 * d d = n + d - n = n + d2 + n = n + d2 if len(str(n)) > len(str(d)): count = count + 1 @@ -38,9 +39,10 @@ def main(): end = default_timer() print('Project Euler, Problem 57') - print('Answer: {}'.format(count)) + print(f'Answer: {count}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p058.py b/Python/p058.py index 853f2d5..fbfbfba 100644 --- a/Python/p058.py +++ b/Python/p058.py @@ -17,14 +17,16 @@ # what is the side length of the square spiral for which the ratio of primes along both diagonals first falls below 10%? from timeit import default_timer + from projecteuler import is_prime + def main(): start = default_timer() # Starting with 1, the next four numbers in the diagonal are 3 (1+2), 5 (1+2+2), 7 (1+2+2+2) -# and 9 (1+2+2+2+2). Check which are prime, increment the counter every time a new prime is -# found, and divide by the number of elements of the diagonal, which are increase by 4 at +# and 9 (1+2+2+2+2). Check which are prime, increment the counter every time a new prime is +# found, and divide by the number of elements of the diagonal, which are increase by 4 at # every cycle. The next four number added to the diagonal are 13 (9+4), 17 (9+4+4), 21 and 25. # Then 25+6 etc., at every cycle the step is increased by 2. Continue until the ratio goes below 0.1. i = 1 @@ -55,16 +57,17 @@ def main(): step = step + 2 diag = diag + 4 l = l + 2 - + if ratio < 0.1: break end = default_timer() print('Project Euler, Problem 58') - print('Answer: {}'.format(l)) + print(f'Answer: {l}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p059.py b/Python/p059.py index c6813f3..3100c29 100644 --- a/Python/p059.py +++ b/Python/p059.py @@ -20,66 +20,70 @@ from timeit import default_timer + class EncryptedText(): def __init__(self, *args, **kwargs): - super(EncryptedText, self).__init__(*args, **kwargs) + super().__init__(*args, **kwargs) self.text = None self.len = 0 def read_text(self, filename): try: - fp = open(filename, 'r') - except: - print('Error while opening file {}'.format(filename)) + with open(filename, 'r', encoding='utf-8') as fp: + self.text = list(map(int, list(fp.readline().split(',')))) + except FileNotFoundError: + print(f'Error while opening file {filename}') + return -1 - self.text = list(map(int, list(fp.readline().split(',')))) self.len = len(self.text) - fp.close() - def decrypt(self): found = 0 for c1 in range(ord('a'), ord('z')+1): - if found: + if found: break - for c2 in range(ord('a'), ord('z')+1): - if found: - break - for c3 in range(ord('a'), ord('z')+1): - if found: - break - plain_text = [''] * self.len - for i in range(0, self.len-2, 3): - plain_text[i] = str(chr(self.text[i]^c1)) - plain_text[i+1] = str(chr(self.text[i+1]^c2)) - plain_text[i+2] = str(chr(self.text[i+2]^c3)) + for c2 in range(ord('a'), ord('z')+1): + if found: + break + + for c3 in range(ord('a'), ord('z')+1): + if found: + break - if i == self.len - 2: - plain_text[i] = str(chr(self.text[i]^c1)) - plain_text[i+1] = str(chr(self.text[i+1]^c2)) + plain_text = [''] * self.len - if i == self.len - 1: - plain_text[i] = str(chr(self.text[i]^c1)) + for i in range(0, self.len-2, 3): + plain_text[i] = str(chr(self.text[i]^c1)) + plain_text[i+1] = str(chr(self.text[i+1]^c2)) + plain_text[i+2] = str(chr(self.text[i+2]^c3)) - plain_text = ''.join(plain_text) + if i == self.len - 2: + plain_text[i] = str(chr(self.text[i]^c1)) + plain_text[i+1] = str(chr(self.text[i+1]^c2)) + + if i == self.len - 1: + plain_text[i] = str(chr(self.text[i]^c1)) + + plain_text = ''.join(plain_text) + + if 'the' in plain_text and 'be' in plain_text and 'to' in plain_text and 'of' in plain_text and\ + 'and' in plain_text and 'in' in plain_text and 'that' in plain_text and 'have' in plain_text: + found = 1 - if 'the' in plain_text and 'be' in plain_text and 'to' in plain_text and 'of' in plain_text and\ - 'and' in plain_text and 'in' in plain_text and 'that' in plain_text and 'have' in plain_text: - found = 1 - return plain_text + def main(): start = default_timer() enc_text = EncryptedText() if enc_text.read_text('cipher.txt') == -1: - exit(1) + sys.exit(1) plain_text = enc_text.decrypt() @@ -91,9 +95,10 @@ def main(): end = default_timer() print('Project Euler, Problem 59') - print('Answer: {}'.format(sum_)) + print(f'Answer: {sum_}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p060.py b/Python/p060.py index a1c9f17..565fa6e 100644 --- a/Python/p060.py +++ b/Python/p060.py @@ -7,8 +7,10 @@ # Find the lowest sum for a set of five primes for which any two primes concatenate to produce another prime. from timeit import default_timer + from projecteuler import sieve, is_prime + def main(): start = default_timer() @@ -29,7 +31,7 @@ def main(): p2 = p1 + 2 while p2 < N and not found: -# If p2 is not prime, or at least one of the possible concatenations of +# If p2 is not prime, or at least one of the possible concatenations of # p1 and p2 is not prime, go to the next number. if primes[p2] == 0 or not is_prime(int(str(p1)+str(p2))) or not is_prime(int(str(p2)+str(p1))): p2 = p2 + 2 @@ -42,8 +44,9 @@ def main(): # p1, p2 and p3 is not prime, got to the next number. if primes[p3] == 0 or not is_prime(int(str(p1)+str(p3))) or not is_prime(int(str(p3)+str(p1))) or\ not is_prime(int(str(p2)+str(p3))) or not is_prime(int(str(p3)+str(p2))): - p3 = p3 + 2 - continue + p3 = p3 + 2 + + continue p4 = p3 + 2 @@ -53,8 +56,9 @@ def main(): if primes[p4] == 0 or not is_prime(int(str(p1)+str(p4))) or not is_prime(int(str(p4)+str(p1))) or\ not is_prime(int(str(p2)+str(p4))) or not is_prime(int(str(p4)+str(p2))) or\ not is_prime(int(str(p3)+str(p4))) or not is_prime(int(str(p4)+str(p3))): - p4 = p4 + 2 - continue + p4 = p4 + 2 + + continue p5 = p4 + 2 @@ -65,8 +69,9 @@ def main(): not is_prime(int(str(p2)+str(p5))) or not is_prime(int(str(p5)+str(p2))) or\ not is_prime(int(str(p3)+str(p5))) or not is_prime(int(str(p5)+str(p3))) or\ not is_prime(int(str(p4)+str(p5))) or not is_prime(int(str(p5)+str(p4))): - p5 = p5 + 2 - continue + p5 = p5 + 2 + + continue # If it gets here, the five values have been found. n = p1 + p2 + p3 + p4 + p5 @@ -83,9 +88,10 @@ def main(): end = default_timer() print('Project Euler, Problem 60') - print('Answer: {}'.format(n)) + print(f'Answer: {n}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p061.py b/Python/p061.py index 4525763..117553b 100644 --- a/Python/p061.py +++ b/Python/p061.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # Triangle, square, pentagonal, hexagonal, heptagonal, and octagonal numbers are all figurate (polygonal) numbers and are generated # by the following formulae: @@ -19,18 +19,22 @@ # Find the sum of the only ordered set of six cyclic 4-digit numbers for which each polygonal type: triangle, square, pentagonal, # hexagonal, heptagonal, and octagonal, is represented by a different number in the set. +from timeit import default_timer + from numpy import zeros -from timeit import default_timer + +polygonal = zeros((6, 10000), int) +chain = [0] * 6 +flags = [0] * 6 +sum_ = 0 + # Recursive function to find the required set. It finds a polygonal number, # check if it can be part of the chain, then use recursion to find the next # number. If a solution can't be found with the current numbers, it uses # backtracking and tries the next polygonal number. def find_set(step): - global polygonal - global chain - global flags global sum_ # Use one polygonal number per type, starting from triangular. @@ -49,7 +53,7 @@ def find_set(step): # If it's the first number, just add it as first step in the chain. if step == 0: chain[step] = j - sum_ = sum_ + j + sum_ += j # Recursively try to add other numbers to the chain. If a solution # is found, return 1. @@ -58,42 +62,34 @@ def find_set(step): # If a solution was not found, backtrack, subtracting the value of # the number from the total. - sum_ = sum_ - j + sum_ -= j # If this is the last step and the current number can be added to the chain, # add it, update the sum and return 1. A solution has been found. elif step == 5 and j % 100 == chain[0] // 100 and j // 100 == chain[step-1] % 100: chain[step] = j - sum_ = sum_ + j + sum_ += j return 1 # For every other step, add the number to the chain if possible, then recursively # try to add other numbers. elif step < 5 and j // 100 == chain[step-1] % 100: chain[step] = j - sum_ = sum_ + j + sum_ += + j if find_set(step+1): return 1 # If a solution was not found, backtrack. - sum_ = sum_ - j + sum_ -= j # Remove the flag for the current polygonal type. flags[i] = 0 return 0 + def main(): start = default_timer() - global polygonal - global chain - global flags - global sum_ - - polygonal = zeros((6, 10000), int) - chain = [0] * 6 - flags = [0] * 6 - sum_ = 0 i = 1 n = 1 @@ -172,9 +168,10 @@ def main(): end = default_timer() print('Project Euler, Problem 61') - print('Answer: {}'.format(sum_)) + print(f'Answer: {sum_}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p062.py b/Python/p062.py index 9118fc9..f3e089f 100644 --- a/Python/p062.py +++ b/Python/p062.py @@ -5,9 +5,10 @@ # # Find the smallest cube for which exactly five permutations of its digits are cube. +from timeit import default_timer + from numpy import zeros -from timeit import default_timer def main(): start = default_timer() @@ -45,9 +46,10 @@ def main(): end = default_timer() print('Project Euler, Problem 62') - print('Answer: {}'.format(cubes[i])) + print(f'Answer: {cubes[i]}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p063.py b/Python/p063.py index e376a9b..37cb589 100644 --- a/Python/p063.py +++ b/Python/p063.py @@ -6,6 +6,7 @@ from timeit import default_timer + def main(): start = default_timer() @@ -30,9 +31,10 @@ def main(): end = default_timer() print('Project Euler, Problem 63') - print('Answer: {}'.format(count)) + print(f'Answer: {count}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p064.py b/Python/p064.py index 159b857..831d6f3 100644 --- a/Python/p064.py +++ b/Python/p064.py @@ -42,19 +42,18 @@ # # How many continued fractions for N≤10000 have an odd period? -from math import floor, sqrt - +from math import sqrt from timeit import default_timer + from projecteuler import build_sqrt_cont_fraction + def is_square(n): p = sqrt(n) m = int(p) - if p == m: - return True - else: - return False + return bool(p == m) + def main(): start = default_timer() @@ -74,9 +73,10 @@ def main(): end = default_timer() print('Project Euler, Problem 64') - print('Answer: {}'.format(count)) + print(f'Answer: {count}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p065.py b/Python/p065.py index 650b8e2..e52d802 100644 --- a/Python/p065.py +++ b/Python/p065.py @@ -31,6 +31,7 @@ from timeit import default_timer + def main(): start = default_timer() @@ -41,10 +42,10 @@ def main(): n1 = 8 n2 = 11 -# For a continued fractions [a_0; a_1, a_2, ...], the numerator of the +# For a continued fractions [a_0; a_1, a_2, ...], the numerator of the # next convergent N_n=a_n*N_(n-1)+N_(n-2). The first three values for e are # 3, 8 and 11, the next ones are easily calculated, considering that a_n -# follows a simple pattern: +# follows a simple pattern: # a_1=1, a_2=2, a_3=1 # a_4=1, a_5=4, a_6=1 # a_7=1, a_8=6, a_9=1 @@ -70,9 +71,10 @@ def main(): end = default_timer() print('Project Euler, Problem 65') - print('Answer: {}'.format(sum_)) + print(f'Answer: {sum_}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p066.py b/Python/p066.py index 4187fd5..9adb00f 100644 --- a/Python/p066.py +++ b/Python/p066.py @@ -21,18 +21,17 @@ # Find the value of D ≤ 1000 in minimal solutions of x for which the largest value of x is obtained. from math import sqrt - from timeit import default_timer + from projecteuler import pell_eq + def is_square(n): p = sqrt(n) m = int(p) - if p == m: - return True - else: - return False + return bool(p == m) + def main(): start = default_timer() @@ -52,9 +51,10 @@ def main(): end = default_timer() print('Project Euler, Problem 66') - print('Answer: {}'.format(max_d)) + print(f'Answer: {max_d}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p067.py b/Python/p067.py index e8dfe60..6b01b05 100644 --- a/Python/p067.py +++ b/Python/p067.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # By starting at the top of the triangle below and moving to adjacent numbers on the row below, the maximum total from top to bottom is 23. # @@ -15,24 +15,24 @@ # If you could check one trillion (1012) routes every second it would take over twenty billion years to check them all. # There is an efficient algorithm to solve it. ;o) +import sys from timeit import default_timer + from projecteuler import find_max_path + def main(): start = default_timer() + triang = [] + try: - fp = open('triangle.txt', 'r') - except: - print('Error while opening file {}'.format('triangle.txt')) - exit(1) - - triang = list() - - for line in fp: - triang.append(line.strip('\n').split()) - - fp.close() + with open('triangle.txt', 'r', encoding='utf-8') as fp: + for line in fp: + triang.append(line.strip('\n').split()) + except FileNotFoundError: + print('Error while opening file triangle.txt') + sys.exit(1) l = len(triang) @@ -45,9 +45,10 @@ def main(): end = default_timer() print('Project Euler, Problem 67') - print('Answer: {}'.format(max_)) + print(f'Answer: {max_}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p068.py b/Python/p068.py index c121d12..ca85ac7 100644 --- a/Python/p068.py +++ b/Python/p068.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # Consider the following "magic" 3-gon ring, filled with the numbers 1 to 6, and each line adding to nine. # @@ -46,9 +46,9 @@ # from itertools import permutations - from timeit import default_timer + # Function to evaluate the ring. The ring is represented as a vector of 2*n elements, # the first n elements represent the external nodes of the ring, the next n elements # represent the internal ring. @@ -91,8 +91,9 @@ def eval_ring(ring, n): return res + def list_to_int(l): - if l == None: + if l is None: return 0 res = 0 @@ -108,6 +109,7 @@ def list_to_int(l): return res + def main(): start = default_timer() @@ -118,8 +120,8 @@ def main(): n = None for ring in rings: - eval_ = eval_ring(ring, 5); - + eval_ = eval_ring(ring, 5) + # Convert the list into an integer number. n = list_to_int(eval_) @@ -129,9 +131,10 @@ def main(): end = default_timer() print('Project Euler, Problem 68') - print('Answer: {}'.format(max_)) + print(f'Answer: {max_}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p069.py b/Python/p069.py index 49df6ad..a119836 100644 --- a/Python/p069.py +++ b/Python/p069.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # Euler's Totient function, φ(n) [sometimes called the phi function], is used to determine the number of numbers less than n which are # relatively prime to n. For example, as 1, 2, 4, 5, 7, and 8, are all less than nine and relatively prime to nine, φ(9)=6. @@ -19,8 +19,10 @@ # Find the value of n ≤ 1,000,000 for which n/φ(n) is a maximum. from timeit import default_timer + from projecteuler import is_prime + def main(): start = default_timer() @@ -47,9 +49,10 @@ def main(): end = default_timer() print('Project Euler, Problem 69') - print('Answer: {}'.format(res)) + print(f'Answer: {res}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p070.py b/Python/p070.py index d00bdd8..92eadab 100644 --- a/Python/p070.py +++ b/Python/p070.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # Euler's Totient function, φ(n) [sometimes called the phi function], is used to determine the number of positive numbers # less than or equal to n which are relatively prime to n. For example, as 1, 2, 4, 5, 7, and 8, are all less than nine and @@ -9,11 +9,11 @@ # # Find the value of n, 1 < n < 10^7, for which φ(n) is a permutation of n and the ratio n/φ(n) produces a minimum. -from numpy import zeros - from timeit import default_timer + from projecteuler import sieve, is_semiprime, phi_semiprime + def main(): start = default_timer() @@ -26,14 +26,14 @@ def main(): for i in range(2, N): # When n is prime, phi(n)=(n-1), so to minimize n/phi(n) we should -# use n prime. But n-1 can't be a permutation of n. The second best +# use n prime. But n-1 can't be a permutation of n. The second best # bet is to use semiprimes. For a semiprime n=p*q, phi(n)=(p-1)(q-1). # So we check if a number is semiprime, if yes calculate phi, finally # check if phi(n) is a permutation of n and update the minimum if it's # smaller. semi_p, a, b = is_semiprime(i, primes) - - if semi_p == True: + + if semi_p is True: p = phi_semiprime(i, a, b) if ''.join(sorted(str(p))) == ''.join(sorted(str(i))) and i / p < min_: @@ -43,9 +43,10 @@ def main(): end = default_timer() print('Project Euler, Problem 70') - print('Answer: {}'.format(n)) + print(f'Answer: {n}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p071.py b/Python/p071.py index 42aaaba..63741d3 100644 --- a/Python/p071.py +++ b/Python/p071.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # Consider the fraction, n/d, where n and d are positive integers. If n target: + + if value > target: return n - else: - n = count(value, n, j, target) - value = value - primes[j] + + n = count(value, n, j, target) + value = value - primes[j] return n + def main(): start = default_timer() - global primes - - primes = [0] * 100 - # Generate a list of the first 100 primes. i = 0 j = 0 @@ -64,9 +65,10 @@ def main(): end = default_timer() print('Project Euler, Problem 77') - print('Answer: {}'.format(i)) + print(f'Answer: {i}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p078.py b/Python/p078.py index ad8e421..66ee8d5 100644 --- a/Python/p078.py +++ b/Python/p078.py @@ -3,19 +3,21 @@ # Let p(n) represent the number of different ways in which n coins can be separated into piles. # For example, five coins can be separated into piles in exactly seven different ways, so p(5)=7. # -# OOOOO -# OOOO O -# OOO OO -# OOO O O -# OO OO O -# OO O O O +# OOOOO +# OOOO O +# OOO OO +# OOO O O +# OO OO O +# OO O O O # O O O O O # # Find the least value of n for which p(n) is divisible by one million. from timeit import default_timer + from projecteuler import partition_fn + def main(): start = default_timer() @@ -26,16 +28,17 @@ def main(): i = 0 # Using the partition function to calculate the number of partitions, -# giving the result modulo N.*/ +# giving the result modulo N.*/ while partition_fn(i, partitions, N) != 0: i = i + 1 end = default_timer() print('Project Euler, Problem 78') - print('Answer: {}'.format(i)) + print(f'Answer: {i}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p079.py b/Python/p079.py index 888ed03..181631a 100644 --- a/Python/p079.py +++ b/Python/p079.py @@ -8,13 +8,14 @@ # Given that the three characters are always asked for in order, analyse the file so as to determine the shortest possible # secret passcode of unknown length. +import sys from itertools import permutations - from timeit import default_timer + def check_passcode(passcode, len_, logins, n): # For every login attempt, check if all the digits appear in the -# passcode in the correct order. Return 0 if a login attempt +# passcode in the correct order. Return 0 if a login attempt # incompatible with the current passcode is found. for i in range(n): k = 0 @@ -30,28 +31,26 @@ def check_passcode(passcode, len_, logins, n): return 1 + def main(): start = default_timer() try: - fp = open('keylog.txt', 'r') - except: - print('Error while opening file {}'.format('keylog.txt')) - exit(1) - - logins = fp.readlines() - - fp.close() + with open('keylog.txt', 'r', encoding='utf-8') as fp: + logins = fp.readlines() + except FileNotFoundError: + print('Error while opening file keylog.txt') + sys.exit(1) digits = [0] * 10 passcode_digits = [0] * 10 for i in logins: keylog = int(i) - + # Check which digits are present in the login attempts. while True: - digits[keylog%10] = digits[keylog%10] + 1 + digits[keylog % 10] = digits[keylog % 10] + 1 keylog = keylog // 10 if keylog == 0: @@ -97,9 +96,10 @@ def main(): end = default_timer() print('Project Euler, Problem 79') - print('Answer: {}'.format(res)) + print(f'Answer: {res}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p080.py b/Python/p080.py index a67e7d2..382d4d9 100644 --- a/Python/p080.py +++ b/Python/p080.py @@ -8,18 +8,16 @@ # For the first one hundred natural numbers, find the total of the digital sums of the first one hundred decimal digits # for all the irrational square roots +from timeit import default_timer from mpmath import sqrt, mp -from timeit import default_timer def is_square(n): p = sqrt(n) m = int(p) - if p == m: - return True - else: - return False + return bool(p == m) + def main(): start = default_timer() @@ -43,9 +41,10 @@ def main(): end = default_timer() print('Project Euler, Problem 80') - print('Answer: {}'.format(sum_)) + print(f'Answer: {sum_}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p081.py b/Python/p081.py index a7972f5..dd327a5 100644 --- a/Python/p081.py +++ b/Python/p081.py @@ -12,8 +12,10 @@ # Find the minimal path sum, in matrix.txt, a 31K text file containing a 80 by 80 matrix, from the top left to the bottom right # by only moving right and down. +import sys from timeit import default_timer + def sum_paths(matrix, m, n): for i in range(m-2, -1, -1): matrix[m-1][i] = matrix[m-1][i] + matrix[m-1][i+1] @@ -27,21 +29,20 @@ def sum_paths(matrix, m, n): matrix[i][j] = matrix[i][j] + matrix[i][j+1] return matrix[0][0] - + + def main(): start = default_timer() try: - fp = open('matrix.txt', 'r') - except: - print('Error while opening file {}'.format('matrix.txt')) - exit(1) - - matrix = fp.readlines() - - fp.close() + with open('matrix.txt', 'r', encoding='utf-8') as fp: + matrix = fp.readlines() + except FileNotFoundError: + print('Error while opening file matrix.txt') + sys.exit(1) j = 0 + for i in matrix: matrix[j] = list(map(int, i.strip().split(','))) j = j + 1 @@ -51,9 +52,10 @@ def main(): end = default_timer() print('Project Euler, Problem 81') - print('Answer: {}'.format(dist)) + print(f'Answer: {dist}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p082.py b/Python/p082.py index 3f2430b..1358e64 100644 --- a/Python/p082.py +++ b/Python/p082.py @@ -15,24 +15,28 @@ # # Find the minimal path sum, in matrix.txt, a 31K text file containing a 80 by 80 matrix, from the left column to the right column. +import sys +from timeit import default_timer + from numpy import zeros -from timeit import default_timer from projecteuler import dijkstra + def main(): start = default_timer() try: - fp = open('matrix.txt', 'r') - except: - print('Error while opening file {}'.format('matrix.txt')) - exit(1) + with open('matrix.txt', 'r', encoding='utf-8') as fp: + matrix = fp.readlines() + except FileNotFoundError: + print('Error while opening file matrix.txt') + sys.exit(1) - matrix = fp.readlines() distances = zeros((80, 80), int) j = 0 + for i in matrix: matrix[j] = list(map(int, i.strip().split(','))) j = j + 1 @@ -53,9 +57,10 @@ def main(): end = default_timer() print('Project Euler, Problem 82') - print('Answer: {}'.format(min_path)) + print(f'Answer: {min_path}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p083.py b/Python/p083.py index 1adbe99..007af42 100644 --- a/Python/p083.py +++ b/Python/p083.py @@ -14,21 +14,24 @@ # Find the minimal path sum, in matrix.txt, a 31K text file containing a 80 by 80 matrix, # from the top left to the bottom right by moving left, right, up, and down. +import sys +from timeit import default_timer + from numpy import zeros -from timeit import default_timer from projecteuler import dijkstra + def main(): start = default_timer() try: - fp = open('matrix.txt', 'r') - except: - print('Error while opening file {}'.format('matrix.txt')) - exit(1) + with open('matrix.txt', 'r', encoding='utf-8') as fp: + matrix = fp.readlines() + except FileNotFoundError: + print('Error while opening file matrix.txt') + sys.exit(1) - matrix = fp.readlines() distances = zeros((80, 80), int) j = 0 @@ -36,16 +39,17 @@ def main(): matrix[j] = list(map(int, i.strip().split(','))) j = j + 1 - dijkstra(matrix, distances, 80, 80, 1, 1) + dijkstra(matrix, distances, 80, 80, 1, 1) dist = distances[79][79] end = default_timer() print('Project Euler, Problem 83') - print('Answer: {}'.format(dist)) + print(f'Answer: {dist}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p104.py b/Python/p104.py index f7659bd..53bb88c 100644 --- a/Python/p104.py +++ b/Python/p104.py @@ -1,3 +1,5 @@ +#! /usr/bin/env python3 + # The Fibonacci sequence is defined by the recurrence relation: # # F_n = F_n−1 + F_n−2, where F_1 = 1 and F_2 = 1. @@ -7,13 +9,17 @@ # # Given that F_k is the first Fibonacci number for which the first nine digits AND the last nine digits are 1-9 pandigital, find k. -#!/usr/bin/python - -from mpmath import matrix, mp - +import sys from timeit import default_timer + +from mpmath import matrix + from projecteuler import is_pandigital + +sys.set_int_max_str_digits(70000) + + def main(): start = default_timer() @@ -45,13 +51,14 @@ def main(): if is_pandigital(int(str(fib)[:9]), 9): found = 1 - + end = default_timer() print('Project Euler, Problem 104') - print('Answer: {}'.format(i)) + print(f'Answer: {i}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p145.py b/Python/p145.py index 4cfc71a..28c3c22 100644 --- a/Python/p145.py +++ b/Python/p145.py @@ -10,11 +10,12 @@ from timeit import default_timer + def main(): start = default_timer() - N = 10000000 - + N = 1000000000 + count = 0 # Brute force approach, sum each number and their reverse and @@ -23,16 +24,17 @@ def main(): if i % 10 != 0: s = str(i + int(''.join(reversed(str(i))))) - if not '0' in s and not '2' in s and not '4' in s and\ - not '6' in s and not '8' in s: + if '0' not in s and '2' not in s and '4' not in s and\ + '6' not in s and '8' not in s: count = count + 1 end = default_timer() print('Project Euler, Problem 145') - print('Answer: {}'.format(count)) + print(f'Answer: {count}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() diff --git a/Python/p206.py b/Python/p206.py index e65da35..cec314d 100644 --- a/Python/p206.py +++ b/Python/p206.py @@ -1,10 +1,11 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 # Find the unique positive integer whose square has the form 1_2_3_4_5_6_7_8_9_0, # where each “_” is a single digit. from timeit import default_timer + def main(): start = default_timer() @@ -37,10 +38,10 @@ def main(): end = default_timer() print('Project Euler, Problem 206') - print('Answer: {}'.format(n)) + print(f'Answer: {n}') + + print(f'Elapsed time: {end - start:.9f} seconds') - print('Elapsed time: {:.9f} seconds'.format(end - start)) if __name__ == '__main__': main() - diff --git a/Python/projecteuler.py b/Python/projecteuler.py index b538783..1feb974 100644 --- a/Python/projecteuler.py +++ b/Python/projecteuler.py @@ -1,4 +1,4 @@ -#!/usr/bin/python3 +#!/usr/bin/env python3 from math import sqrt, floor, ceil, gcd diff --git a/README.md b/README.md index 2eb05b5..3f5eaba 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,6 @@ # My Project Euler solutions These are my solutions in C and Python, not necessarily the best solutions. I've solved most of the first 100 problems, currently working on cleaning the code and uploading it. I will try to solve more problems in the future. +# Issues +- Solutions for problems 82 and 145 in Python run really slow. +- Solutions for problems 84, 85, 86, 87, 89, 92, 95, 96, 97. 99, 102, 112, 124 and 357 have been implemented in C but not in Python.