Fix style of the first ten solutions for Project Euler (#3242)

* Fix style of the first ten solutions for Project Euler

- Unify the header docstring, and add reference URLs to wikipedia
  or similar
- Fix docstrings to be properly multilined
- Add newlines where appropriate
- Add doctests where they were missing
- Remove doctests that test for the correct solution
- fix obvious spelling or grammar mistakes in comments and
  exception messages
- Fix line endings to be UNIX. This makes two of the files seem
  to have changed completely
- no functional changes in any of the solutions were done
  (except for the spelling fixes mentioned above)

* Fix docstrings and main function as per Style Guide
This commit is contained in:
Michael D 2020-10-25 04:23:16 +01:00 committed by GitHub
parent 5be77f33f7
commit 98e9d6bdb6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
35 changed files with 717 additions and 469 deletions

View File

@ -1,13 +1,18 @@
""" """
Problem Statement: Project Euler Problem 1: https://projecteuler.net/problem=1
Multiples of 3 and 5
If we list all the natural numbers below 10 that are multiples of 3 or 5, 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. we get 3, 5, 6 and 9. The sum of these multiples is 23.
Find the sum of all the multiples of 3 or 5 below N.
Find the sum of all the multiples of 3 or 5 below 1000.
""" """
def solution(n: int = 1000) -> int: def solution(n: int = 1000) -> int:
"""Returns the sum of all the multiples of 3 or 5 below n. """
Returns the sum of all the multiples of 3 or 5 below n.
>>> solution(3) >>> solution(3)
0 0
@ -25,4 +30,4 @@ def solution(n: int = 1000) -> int:
if __name__ == "__main__": if __name__ == "__main__":
print(solution(int(input().strip()))) print(f"{solution() = }")

View File

@ -1,13 +1,18 @@
""" """
Problem Statement: Project Euler Problem 1: https://projecteuler.net/problem=1
Multiples of 3 and 5
If we list all the natural numbers below 10 that are multiples of 3 or 5, 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. we get 3, 5, 6 and 9. The sum of these multiples is 23.
Find the sum of all the multiples of 3 or 5 below N.
Find the sum of all the multiples of 3 or 5 below 1000.
""" """
def solution(n: int = 1000) -> int: def solution(n: int = 1000) -> int:
"""Returns the sum of all the multiples of 3 or 5 below n. """
Returns the sum of all the multiples of 3 or 5 below n.
>>> solution(3) >>> solution(3)
0 0
@ -30,4 +35,4 @@ def solution(n: int = 1000) -> int:
if __name__ == "__main__": if __name__ == "__main__":
print(solution(int(input().strip()))) print(f"{solution() = }")

View File

@ -1,8 +1,12 @@
""" """
Problem Statement: Project Euler Problem 1: https://projecteuler.net/problem=1
Multiples of 3 and 5
If we list all the natural numbers below 10 that are multiples of 3 or 5, 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. we get 3, 5, 6 and 9. The sum of these multiples is 23.
Find the sum of all the multiples of 3 or 5 below N.
Find the sum of all the multiples of 3 or 5 below 1000.
""" """
@ -57,4 +61,4 @@ def solution(n: int = 1000) -> int:
if __name__ == "__main__": if __name__ == "__main__":
print(solution(int(input().strip()))) print(f"{solution() = }")

View File

@ -1,47 +1,52 @@
""" """
Problem Statement: Project Euler Problem 1: https://projecteuler.net/problem=1
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. Multiples of 3 and 5
Find the sum of all the multiples of 3 or 5 below N.
""" 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.
def solution(n: int = 1000) -> int: Find the sum of all the multiples of 3 or 5 below 1000.
"""Returns the sum of all the multiples of 3 or 5 below n. """
>>> solution(3)
0 def solution(n: int = 1000) -> int:
>>> solution(4) """
3 Returns the sum of all the multiples of 3 or 5 below n.
>>> solution(10)
23 >>> solution(3)
>>> solution(600) 0
83700 >>> solution(4)
""" 3
>>> solution(10)
xmulti = [] 23
zmulti = [] >>> solution(600)
z = 3 83700
x = 5 """
temp = 1
while True: xmulti = []
result = z * temp zmulti = []
if result < n: z = 3
zmulti.append(result) x = 5
temp += 1 temp = 1
else: while True:
temp = 1 result = z * temp
break if result < n:
while True: zmulti.append(result)
result = x * temp temp += 1
if result < n: else:
xmulti.append(result) temp = 1
temp += 1 break
else: while True:
break result = x * temp
collection = list(set(xmulti + zmulti)) if result < n:
return sum(collection) xmulti.append(result)
temp += 1
else:
if __name__ == "__main__": break
print(solution(int(input().strip()))) collection = list(set(xmulti + zmulti))
return sum(collection)
if __name__ == "__main__":
print(f"{solution() = }")

View File

@ -1,14 +1,19 @@
""" """
Problem Statement: Project Euler Problem 1: https://projecteuler.net/problem=1
Multiples of 3 and 5
If we list all the natural numbers below 10 that are multiples of 3 or 5, 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. we get 3, 5, 6 and 9. The sum of these multiples is 23.
Find the sum of all the multiples of 3 or 5 below N.
Find the sum of all the multiples of 3 or 5 below 1000.
""" """
def solution(n: int = 1000) -> int: def solution(n: int = 1000) -> int:
"""Returns the sum of all the multiples of 3 or 5 below n. """
A straightforward pythonic solution using list comprehension. Returns the sum of all the multiples of 3 or 5 below n.
A straightforward pythonic solution using list comprehension.
>>> solution(3) >>> solution(3)
0 0
@ -24,4 +29,4 @@ def solution(n: int = 1000) -> int:
if __name__ == "__main__": if __name__ == "__main__":
print(solution(int(input().strip()))) print(f"{solution() = }")

View File

@ -1,13 +1,18 @@
""" """
Problem Statement: Project Euler Problem 1: https://projecteuler.net/problem=1
Multiples of 3 and 5
If we list all the natural numbers below 10 that are multiples of 3 or 5, 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. we get 3, 5, 6 and 9. The sum of these multiples is 23.
Find the sum of all the multiples of 3 or 5 below N.
Find the sum of all the multiples of 3 or 5 below 1000.
""" """
def solution(n: int = 1000) -> int: def solution(n: int = 1000) -> int:
"""Returns the sum of all the multiples of 3 or 5 below n. """
Returns the sum of all the multiples of 3 or 5 below n.
>>> solution(3) >>> solution(3)
0 0
@ -31,4 +36,4 @@ def solution(n: int = 1000) -> int:
if __name__ == "__main__": if __name__ == "__main__":
print(solution(int(input().strip()))) print(f"{solution() = }")

View File

@ -1,13 +1,18 @@
""" """
Problem Statement: Project Euler Problem 1: https://projecteuler.net/problem=1
Multiples of 3 and 5
If we list all the natural numbers below 10 that are multiples of 3 or 5, 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. we get 3, 5, 6 and 9. The sum of these multiples is 23.
Find the sum of all the multiples of 3 or 5 below N.
Find the sum of all the multiples of 3 or 5 below 1000.
""" """
def solution(n: int = 1000) -> int: def solution(n: int = 1000) -> int:
"""Returns the sum of all the multiples of 3 or 5 below n. """
Returns the sum of all the multiples of 3 or 5 below n.
>>> solution(3) >>> solution(3)
0 0
@ -29,4 +34,4 @@ def solution(n: int = 1000) -> int:
if __name__ == "__main__": if __name__ == "__main__":
print(solution(int(input().strip()))) print(f"{solution() = }")

View File

@ -1,19 +1,25 @@
""" """
Problem: Project Euler Problem 2: https://projecteuler.net/problem=2
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:
1,2,3,5,8,13,21,34,55,89,.. Even Fibonacci Numbers
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:
1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
By considering the terms in the Fibonacci sequence whose values do not exceed By considering the terms in the Fibonacci sequence whose values do not exceed
n, find the sum of the even-valued terms. e.g. for n=10, we have {2,8}, sum is four million, find the sum of the even-valued terms.
10.
References:
- https://en.wikipedia.org/wiki/Fibonacci_number
""" """
def solution(n: int = 4000000) -> int: def solution(n: int = 4000000) -> int:
"""Returns the sum of all fibonacci sequence even elements that are lower """
or equals to n. Returns the sum of all even fibonacci sequence elements that are lower
or equal to n.
>>> solution(10) >>> solution(10)
10 10
@ -26,6 +32,7 @@ def solution(n: int = 4000000) -> int:
>>> solution(34) >>> solution(34)
44 44
""" """
i = 1 i = 1
j = 2 j = 2
total = 0 total = 0
@ -38,4 +45,4 @@ def solution(n: int = 4000000) -> int:
if __name__ == "__main__": if __name__ == "__main__":
print(solution(int(input().strip()))) print(f"{solution() = }")

View File

@ -1,39 +1,46 @@
""" """
Problem: Project Euler Problem 2: https://projecteuler.net/problem=2
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: Even Fibonacci Numbers
1,2,3,5,8,13,21,34,55,89,.. 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:
By considering the terms in the Fibonacci sequence whose values do not exceed
n, find the sum of the even-valued terms. e.g. for n=10, we have {2,8}, sum is 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
10.
""" By considering the terms in the Fibonacci sequence whose values do not exceed
four million, find the sum of the even-valued terms.
def solution(n: int = 4000000) -> int: References:
"""Returns the sum of all fibonacci sequence even elements that are lower - https://en.wikipedia.org/wiki/Fibonacci_number
or equals to n. """
>>> solution(10)
10 def solution(n: int = 4000000) -> int:
>>> solution(15) """
10 Returns the sum of all even fibonacci sequence elements that are lower
>>> solution(2) or equal to n.
2
>>> solution(1) >>> solution(10)
0 10
>>> solution(34) >>> solution(15)
44 10
""" >>> solution(2)
even_fibs = [] 2
a, b = 0, 1 >>> solution(1)
while b <= n: 0
if b % 2 == 0: >>> solution(34)
even_fibs.append(b) 44
a, b = b, a + b """
return sum(even_fibs)
even_fibs = []
a, b = 0, 1
if __name__ == "__main__": while b <= n:
print(solution(int(input().strip()))) if b % 2 == 0:
even_fibs.append(b)
a, b = b, a + b
return sum(even_fibs)
if __name__ == "__main__":
print(f"{solution() = }")

View File

@ -1,19 +1,25 @@
""" """
Problem: Project Euler Problem 2: https://projecteuler.net/problem=2
Even Fibonacci Numbers
Each new term in the Fibonacci sequence is generated by adding the previous 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: two terms. By starting with 1 and 2, the first 10 terms will be:
1,2,3,5,8,13,21,34,55,89,.. 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
By considering the terms in the Fibonacci sequence whose values do not exceed By considering the terms in the Fibonacci sequence whose values do not exceed
n, find the sum of the even-valued terms. e.g. for n=10, we have {2,8}, sum is four million, find the sum of the even-valued terms.
10.
References:
- https://en.wikipedia.org/wiki/Fibonacci_number
""" """
def solution(n: int = 4000000) -> int: def solution(n: int = 4000000) -> int:
"""Returns the sum of all fibonacci sequence even elements that are lower """
or equals to n. Returns the sum of all even fibonacci sequence elements that are lower
or equal to n.
>>> solution(10) >>> solution(10)
10 10
@ -26,6 +32,7 @@ def solution(n: int = 4000000) -> int:
>>> solution(34) >>> solution(34)
44 44
""" """
if n <= 1: if n <= 1:
return 0 return 0
a = 0 a = 0
@ -38,4 +45,4 @@ def solution(n: int = 4000000) -> int:
if __name__ == "__main__": if __name__ == "__main__":
print(solution(int(input().strip()))) print(f"{solution() = }")

View File

@ -1,21 +1,27 @@
""" """
Problem: Project Euler Problem 2: https://projecteuler.net/problem=2
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:
1,2,3,5,8,13,21,34,55,89,.. Even Fibonacci Numbers
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:
1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
By considering the terms in the Fibonacci sequence whose values do not exceed By considering the terms in the Fibonacci sequence whose values do not exceed
n, find the sum of the even-valued terms. e.g. for n=10, we have {2,8}, sum is four million, find the sum of the even-valued terms.
10.
References:
- https://en.wikipedia.org/wiki/Fibonacci_number
""" """
import math import math
from decimal import Decimal, getcontext from decimal import Decimal, getcontext
def solution(n: int = 4000000) -> int: def solution(n: int = 4000000) -> int:
"""Returns the sum of all fibonacci sequence even elements that are lower """
or equals to n. Returns the sum of all even fibonacci sequence elements that are lower
or equal to n.
>>> solution(10) >>> solution(10)
10 10
@ -32,26 +38,27 @@ def solution(n: int = 4000000) -> int:
>>> solution(0) >>> solution(0)
Traceback (most recent call last): Traceback (most recent call last):
... ...
ValueError: Parameter n must be greater or equal to one. ValueError: Parameter n must be greater than or equal to one.
>>> solution(-17) >>> solution(-17)
Traceback (most recent call last): Traceback (most recent call last):
... ...
ValueError: Parameter n must be greater or equal to one. ValueError: Parameter n must be greater than or equal to one.
>>> solution([]) >>> solution([])
Traceback (most recent call last): Traceback (most recent call last):
... ...
TypeError: Parameter n must be int or passive of cast to int. TypeError: Parameter n must be int or castable to int.
>>> solution("asd") >>> solution("asd")
Traceback (most recent call last): Traceback (most recent call last):
... ...
TypeError: Parameter n must be int or passive of cast to int. TypeError: Parameter n must be int or castable to int.
""" """
try: try:
n = int(n) n = int(n)
except (TypeError, ValueError): except (TypeError, ValueError):
raise TypeError("Parameter n must be int or passive of cast to int.") raise TypeError("Parameter n must be int or castable to int.")
if n <= 0: if n <= 0:
raise ValueError("Parameter n must be greater or equal to one.") raise ValueError("Parameter n must be greater than or equal to one.")
getcontext().prec = 100 getcontext().prec = 100
phi = (Decimal(5) ** Decimal(0.5) + 1) / Decimal(2) phi = (Decimal(5) ** Decimal(0.5) + 1) / Decimal(2)
@ -62,4 +69,4 @@ def solution(n: int = 4000000) -> int:
if __name__ == "__main__": if __name__ == "__main__":
print(solution(int(input().strip()))) print(f"{solution() = }")

View File

@ -1,19 +1,25 @@
""" """
Problem: Project Euler Problem 2: https://projecteuler.net/problem=2
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:
1,2,3,5,8,13,21,34,55,89,.. Even Fibonacci Numbers
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:
1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
By considering the terms in the Fibonacci sequence whose values do not exceed By considering the terms in the Fibonacci sequence whose values do not exceed
n, find the sum of the even-valued terms. e.g. for n=10, we have {2,8}, sum is four million, find the sum of the even-valued terms.
10.
References:
- https://en.wikipedia.org/wiki/Fibonacci_number
""" """
def solution(n: int = 4000000) -> int: def solution(n: int = 4000000) -> int:
"""Returns the sum of all fibonacci sequence even elements that are lower """
or equals to n. Returns the sum of all even fibonacci sequence elements that are lower
or equal to n.
>>> solution(10) >>> solution(10)
10 10
@ -43,4 +49,4 @@ def solution(n: int = 4000000) -> int:
if __name__ == "__main__": if __name__ == "__main__":
print(solution(int(input().strip()))) print(f"{solution() = }")

View File

@ -1,16 +1,22 @@
""" """
Problem: Project Euler Problem 3: https://projecteuler.net/problem=3
The prime factors of 13195 are 5,7,13 and 29. What is the largest prime factor
of a given number N?
e.g. for 10, largest prime factor = 5. For 17, largest prime factor = 17. Largest prime factor
The prime factors of 13195 are 5, 7, 13 and 29.
What is the largest prime factor of the number 600851475143?
References:
- https://en.wikipedia.org/wiki/Prime_number#Unique_factorization
""" """
import math import math
def isprime(num: int) -> bool: def isprime(num: int) -> bool:
"""Returns boolean representing primality of given number num. """
Returns boolean representing primality of given number num.
>>> isprime(2) >>> isprime(2)
True True
>>> isprime(3) >>> isprime(3)
@ -22,14 +28,15 @@ def isprime(num: int) -> bool:
>>> isprime(0) >>> isprime(0)
Traceback (most recent call last): Traceback (most recent call last):
... ...
ValueError: Parameter num must be greater or equal to two. ValueError: Parameter num must be greater than or equal to two.
>>> isprime(1) >>> isprime(1)
Traceback (most recent call last): Traceback (most recent call last):
... ...
ValueError: Parameter num must be greater or equal to two. ValueError: Parameter num must be greater than or equal to two.
""" """
if num <= 1: if num <= 1:
raise ValueError("Parameter num must be greater or equal to two.") raise ValueError("Parameter num must be greater than or equal to two.")
if num == 2: if num == 2:
return True return True
elif num % 2 == 0: elif num % 2 == 0:
@ -41,7 +48,9 @@ def isprime(num: int) -> bool:
def solution(n: int = 600851475143) -> int: def solution(n: int = 600851475143) -> int:
"""Returns the largest prime factor of a given number n. """
Returns the largest prime factor of a given number n.
>>> solution(13195) >>> solution(13195)
29 29
>>> solution(10) >>> solution(10)
@ -53,26 +62,27 @@ def solution(n: int = 600851475143) -> int:
>>> solution(0) >>> solution(0)
Traceback (most recent call last): Traceback (most recent call last):
... ...
ValueError: Parameter n must be greater or equal to one. ValueError: Parameter n must be greater than or equal to one.
>>> solution(-17) >>> solution(-17)
Traceback (most recent call last): Traceback (most recent call last):
... ...
ValueError: Parameter n must be greater or equal to one. ValueError: Parameter n must be greater than or equal to one.
>>> solution([]) >>> solution([])
Traceback (most recent call last): Traceback (most recent call last):
... ...
TypeError: Parameter n must be int or passive of cast to int. TypeError: Parameter n must be int or castable to int.
>>> solution("asd") >>> solution("asd")
Traceback (most recent call last): Traceback (most recent call last):
... ...
TypeError: Parameter n must be int or passive of cast to int. TypeError: Parameter n must be int or castable to int.
""" """
try: try:
n = int(n) n = int(n)
except (TypeError, ValueError): except (TypeError, ValueError):
raise TypeError("Parameter n must be int or passive of cast to int.") raise TypeError("Parameter n must be int or castable to int.")
if n <= 0: if n <= 0:
raise ValueError("Parameter n must be greater or equal to one.") raise ValueError("Parameter n must be greater than or equal to one.")
max_number = 0 max_number = 0
if isprime(n): if isprime(n):
return n return n
@ -91,4 +101,4 @@ def solution(n: int = 600851475143) -> int:
if __name__ == "__main__": if __name__ == "__main__":
print(solution(int(input().strip()))) print(f"{solution() = }")

View File

@ -1,14 +1,21 @@
""" """
Problem: Project Euler Problem 3: https://projecteuler.net/problem=3
The prime factors of 13195 are 5,7,13 and 29. What is the largest prime factor
of a given number N?
e.g. for 10, largest prime factor = 5. For 17, largest prime factor = 17. Largest prime factor
The prime factors of 13195 are 5, 7, 13 and 29.
What is the largest prime factor of the number 600851475143?
References:
- https://en.wikipedia.org/wiki/Prime_number#Unique_factorization
""" """
def solution(n: int = 600851475143) -> int: def solution(n: int = 600851475143) -> int:
"""Returns the largest prime factor of a given number n. """
Returns the largest prime factor of a given number n.
>>> solution(13195) >>> solution(13195)
29 29
>>> solution(10) >>> solution(10)
@ -20,26 +27,27 @@ def solution(n: int = 600851475143) -> int:
>>> solution(0) >>> solution(0)
Traceback (most recent call last): Traceback (most recent call last):
... ...
ValueError: Parameter n must be greater or equal to one. ValueError: Parameter n must be greater than or equal to one.
>>> solution(-17) >>> solution(-17)
Traceback (most recent call last): Traceback (most recent call last):
... ...
ValueError: Parameter n must be greater or equal to one. ValueError: Parameter n must be greater than or equal to one.
>>> solution([]) >>> solution([])
Traceback (most recent call last): Traceback (most recent call last):
... ...
TypeError: Parameter n must be int or passive of cast to int. TypeError: Parameter n must be int or castable to int.
>>> solution("asd") >>> solution("asd")
Traceback (most recent call last): Traceback (most recent call last):
... ...
TypeError: Parameter n must be int or passive of cast to int. TypeError: Parameter n must be int or castable to int.
""" """
try: try:
n = int(n) n = int(n)
except (TypeError, ValueError): except (TypeError, ValueError):
raise TypeError("Parameter n must be int or passive of cast to int.") raise TypeError("Parameter n must be int or castable to int.")
if n <= 0: if n <= 0:
raise ValueError("Parameter n must be greater or equal to one.") raise ValueError("Parameter n must be greater than or equal to one.")
prime = 1 prime = 1
i = 2 i = 2
while i * i <= n: while i * i <= n:
@ -53,4 +61,4 @@ def solution(n: int = 600851475143) -> int:
if __name__ == "__main__": if __name__ == "__main__":
print(solution(int(input().strip()))) print(f"{solution() = }")

View File

@ -1,14 +1,21 @@
""" """
Problem: Project Euler Problem 3: https://projecteuler.net/problem=3
The prime factors of 13195 are 5,7,13 and 29. What is the largest prime factor
of a given number N?
e.g. for 10, largest prime factor = 5. For 17, largest prime factor = 17. Largest prime factor
The prime factors of 13195 are 5, 7, 13 and 29.
What is the largest prime factor of the number 600851475143?
References:
- https://en.wikipedia.org/wiki/Prime_number#Unique_factorization
""" """
def solution(n: int = 600851475143) -> int: def solution(n: int = 600851475143) -> int:
"""Returns the largest prime factor of a given number n. """
Returns the largest prime factor of a given number n.
>>> solution(13195) >>> solution(13195)
29 29
>>> solution(10) >>> solution(10)
@ -20,26 +27,27 @@ def solution(n: int = 600851475143) -> int:
>>> solution(0) >>> solution(0)
Traceback (most recent call last): Traceback (most recent call last):
... ...
ValueError: Parameter n must be greater or equal to one. ValueError: Parameter n must be greater than or equal to one.
>>> solution(-17) >>> solution(-17)
Traceback (most recent call last): Traceback (most recent call last):
... ...
ValueError: Parameter n must be greater or equal to one. ValueError: Parameter n must be greater than or equal to one.
>>> solution([]) >>> solution([])
Traceback (most recent call last): Traceback (most recent call last):
... ...
TypeError: Parameter n must be int or passive of cast to int. TypeError: Parameter n must be int or castable to int.
>>> solution("asd") >>> solution("asd")
Traceback (most recent call last): Traceback (most recent call last):
... ...
TypeError: Parameter n must be int or passive of cast to int. TypeError: Parameter n must be int or castable to int.
""" """
try: try:
n = int(n) n = int(n)
except (TypeError, ValueError): except (TypeError, ValueError):
raise TypeError("Parameter n must be int or passive of cast to int.") raise TypeError("Parameter n must be int or castable to int.")
if n <= 0: if n <= 0:
raise ValueError("Parameter n must be greater or equal to one.") raise ValueError("Parameter n must be greater than or equal to one.")
i = 2 i = 2
ans = 0 ans = 0
if n == 2: if n == 2:
@ -55,4 +63,4 @@ def solution(n: int = 600851475143) -> int:
if __name__ == "__main__": if __name__ == "__main__":
print(solution(int(input().strip()))) print(f"{solution() = }")

View File

@ -1,15 +1,21 @@
""" """
Problem: Project Euler Problem 4: https://projecteuler.net/problem=4
A palindromic number reads the same both ways. The largest palindrome made from
the product of two 2-digit numbers is 9009 = 91 x 99.
Find the largest palindrome made from the product of two 3-digit numbers which Largest palindrome product
is less than N.
A palindromic number reads the same both ways. The largest palindrome made
from the product of two 2-digit numbers is 9009 = 91 × 99.
Find the largest palindrome made from the product of two 3-digit numbers.
References:
- https://en.wikipedia.org/wiki/Palindromic_number
""" """
def solution(n: int = 998001) -> int: def solution(n: int = 998001) -> int:
"""Returns the largest palindrome made from the product of two 3-digit """
Returns the largest palindrome made from the product of two 3-digit
numbers which is less than n. numbers which is less than n.
>>> solution(20000) >>> solution(20000)
@ -23,10 +29,10 @@ def solution(n: int = 998001) -> int:
... ...
ValueError: That number is larger than our acceptable range. ValueError: That number is larger than our acceptable range.
""" """
# fetches the next number # fetches the next number
for number in range(n - 1, 9999, -1): for number in range(n - 1, 9999, -1):
# converts number into string.
str_number = str(number) str_number = str(number)
# checks whether 'str_number' is a palindrome. # checks whether 'str_number' is a palindrome.
@ -44,8 +50,4 @@ def solution(n: int = 998001) -> int:
if __name__ == "__main__": if __name__ == "__main__":
import doctest print(f"{solution() = }")
doctest.testmod()
print(solution(int(input().strip())))

View File

@ -1,15 +1,21 @@
""" """
Problem: Project Euler Problem 4: https://projecteuler.net/problem=4
A palindromic number reads the same both ways. The largest palindrome made from
the product of two 2-digit numbers is 9009 = 91 x 99.
Find the largest palindrome made from the product of two 3-digit numbers which Largest palindrome product
is less than N.
A palindromic number reads the same both ways. The largest palindrome made
from the product of two 2-digit numbers is 9009 = 91 × 99.
Find the largest palindrome made from the product of two 3-digit numbers.
References:
- https://en.wikipedia.org/wiki/Palindromic_number
""" """
def solution(n: int = 998001) -> int: def solution(n: int = 998001) -> int:
"""Returns the largest palindrome made from the product of two 3-digit """
Returns the largest palindrome made from the product of two 3-digit
numbers which is less than n. numbers which is less than n.
>>> solution(20000) >>> solution(20000)
@ -19,6 +25,7 @@ def solution(n: int = 998001) -> int:
>>> solution(40000) >>> solution(40000)
39893 39893
""" """
answer = 0 answer = 0
for i in range(999, 99, -1): # 3 digit numbers range from 999 down to 100 for i in range(999, 99, -1): # 3 digit numbers range from 999 down to 100
for j in range(999, 99, -1): for j in range(999, 99, -1):
@ -29,4 +36,4 @@ def solution(n: int = 998001) -> int:
if __name__ == "__main__": if __name__ == "__main__":
print(solution(int(input().strip()))) print(f"{solution() = }")

View File

@ -1,23 +1,28 @@
""" """
Problem: Project Euler Problem 5: https://projecteuler.net/problem=5
2520 is the smallest number that can be divided by each of the numbers from 1
to 10 without any remainder.
What is the smallest positive number that is evenly divisible(divisible with no Smallest multiple
remainder) by all of the numbers from 1 to N?
2520 is the smallest number that can be divided by each of the numbers
from 1 to 10 without any remainder.
What is the smallest positive number that is _evenly divisible_ by all
of the numbers from 1 to 20?
References:
- https://en.wiktionary.org/wiki/evenly_divisible
""" """
def solution(n: int = 20) -> int: def solution(n: int = 20) -> int:
"""Returns the smallest positive number that is evenly divisible(divisible """
Returns the smallest positive number that is evenly divisible (divisible
with no remainder) by all of the numbers from 1 to n. with no remainder) by all of the numbers from 1 to n.
>>> solution(10) >>> solution(10)
2520 2520
>>> solution(15) >>> solution(15)
360360 360360
>>> solution(20)
232792560
>>> solution(22) >>> solution(22)
232792560 232792560
>>> solution(3.4) >>> solution(3.4)
@ -25,26 +30,27 @@ def solution(n: int = 20) -> int:
>>> solution(0) >>> solution(0)
Traceback (most recent call last): Traceback (most recent call last):
... ...
ValueError: Parameter n must be greater or equal to one. ValueError: Parameter n must be greater than or equal to one.
>>> solution(-17) >>> solution(-17)
Traceback (most recent call last): Traceback (most recent call last):
... ...
ValueError: Parameter n must be greater or equal to one. ValueError: Parameter n must be greater than or equal to one.
>>> solution([]) >>> solution([])
Traceback (most recent call last): Traceback (most recent call last):
... ...
TypeError: Parameter n must be int or passive of cast to int. TypeError: Parameter n must be int or castable to int.
>>> solution("asd") >>> solution("asd")
Traceback (most recent call last): Traceback (most recent call last):
... ...
TypeError: Parameter n must be int or passive of cast to int. TypeError: Parameter n must be int or castable to int.
""" """
try: try:
n = int(n) n = int(n)
except (TypeError, ValueError): except (TypeError, ValueError):
raise TypeError("Parameter n must be int or passive of cast to int.") raise TypeError("Parameter n must be int or castable to int.")
if n <= 0: if n <= 0:
raise ValueError("Parameter n must be greater or equal to one.") raise ValueError("Parameter n must be greater than or equal to one.")
i = 0 i = 0
while 1: while 1:
i += n * (n - 1) i += n * (n - 1)
@ -60,4 +66,4 @@ def solution(n: int = 20) -> int:
if __name__ == "__main__": if __name__ == "__main__":
print(solution(int(input().strip()))) print(f"{solution() = }")

View File

@ -1,38 +1,70 @@
""" """
Problem: Project Euler Problem 5: https://projecteuler.net/problem=5
2520 is the smallest number that can be divided by each of the numbers from 1
to 10 without any remainder.
What is the smallest positive number that is evenly divisible(divisible with no Smallest multiple
remainder) by all of the numbers from 1 to N?
2520 is the smallest number that can be divided by each of the numbers
from 1 to 10 without any remainder.
What is the smallest positive number that is _evenly divisible_ by all
of the numbers from 1 to 20?
References:
- https://en.wiktionary.org/wiki/evenly_divisible
- https://en.wikipedia.org/wiki/Euclidean_algorithm
- https://en.wikipedia.org/wiki/Least_common_multiple
""" """
""" Euclidean GCD Algorithm """
def gcd(x: int, y: int) -> int: def gcd(x: int, y: int) -> int:
"""
Euclidean GCD algorithm (Greatest Common Divisor)
>>> gcd(0, 0)
0
>>> gcd(23, 42)
1
>>> gcd(15, 33)
3
>>> gcd(12345, 67890)
15
"""
return x if y == 0 else gcd(y, x % y) return x if y == 0 else gcd(y, x % y)
""" Using the property lcm*gcd of two numbers = product of them """
def lcm(x: int, y: int) -> int: def lcm(x: int, y: int) -> int:
"""
Least Common Multiple.
Using the property that lcm(a, b) * gcd(a, b) = a*b
>>> lcm(3, 15)
15
>>> lcm(1, 27)
27
>>> lcm(13, 27)
351
>>> lcm(64, 48)
192
"""
return (x * y) // gcd(x, y) return (x * y) // gcd(x, y)
def solution(n: int = 20) -> int: def solution(n: int = 20) -> int:
"""Returns the smallest positive number that is evenly divisible(divisible """
Returns the smallest positive number that is evenly divisible (divisible
with no remainder) by all of the numbers from 1 to n. with no remainder) by all of the numbers from 1 to n.
>>> solution(10) >>> solution(10)
2520 2520
>>> solution(15) >>> solution(15)
360360 360360
>>> solution(20)
232792560
>>> solution(22) >>> solution(22)
232792560 232792560
""" """
g = 1 g = 1
for i in range(1, n + 1): for i in range(1, n + 1):
g = lcm(g, i) g = lcm(g, i)
@ -40,4 +72,4 @@ def solution(n: int = 20) -> int:
if __name__ == "__main__": if __name__ == "__main__":
print(solution(int(input().strip()))) print(f"{solution() = }")

View File

@ -1,22 +1,25 @@
""" """
Problem 6: https://projecteuler.net/problem=6 Project Euler Problem 6: https://projecteuler.net/problem=6
Sum square difference
The sum of the squares of the first ten natural numbers is, The sum of the squares of the first ten natural numbers is,
1^2 + 2^2 + ... + 10^2 = 385 1^2 + 2^2 + ... + 10^2 = 385
The square of the sum of the first ten natural numbers is, The square of the sum of the first ten natural numbers is,
(1 + 2 + ... + 10)^2 = 552 = 3025 (1 + 2 + ... + 10)^2 = 55^2 = 3025
Hence the difference between the sum of the squares of the first ten natural Hence the difference between the sum of the squares of the first ten
numbers and the square of the sum is 3025 385 = 2640. natural numbers and the square of the sum is 3025 - 385 = 2640.
Find the difference between the sum of the squares of the first N natural Find the difference between the sum of the squares of the first one
numbers and the square of the sum. hundred natural numbers and the square of the sum.
""" """
def solution(n: int = 100) -> int: def solution(n: int = 100) -> int:
"""Returns the difference between the sum of the squares of the first n """
Returns the difference between the sum of the squares of the first n
natural numbers and the square of the sum. natural numbers and the square of the sum.
>>> solution(10) >>> solution(10)
@ -27,9 +30,8 @@ def solution(n: int = 100) -> int:
41230 41230
>>> solution(50) >>> solution(50)
1582700 1582700
>>> solution()
25164150
""" """
sum_of_squares = 0 sum_of_squares = 0
sum_of_ints = 0 sum_of_ints = 0
for i in range(1, n + 1): for i in range(1, n + 1):
@ -39,7 +41,4 @@ def solution(n: int = 100) -> int:
if __name__ == "__main__": if __name__ == "__main__":
import doctest print(f"{solution() = }")
doctest.testmod()
print(solution(int(input().strip())))

View File

@ -1,22 +1,25 @@
""" """
Problem 6: https://projecteuler.net/problem=6 Project Euler Problem 6: https://projecteuler.net/problem=6
Sum square difference
The sum of the squares of the first ten natural numbers is, The sum of the squares of the first ten natural numbers is,
1^2 + 2^2 + ... + 10^2 = 385 1^2 + 2^2 + ... + 10^2 = 385
The square of the sum of the first ten natural numbers is, The square of the sum of the first ten natural numbers is,
(1 + 2 + ... + 10)^2 = 552 = 3025 (1 + 2 + ... + 10)^2 = 55^2 = 3025
Hence the difference between the sum of the squares of the first ten natural Hence the difference between the sum of the squares of the first ten
numbers and the square of the sum is 3025 385 = 2640. natural numbers and the square of the sum is 3025 - 385 = 2640.
Find the difference between the sum of the squares of the first N natural Find the difference between the sum of the squares of the first one
numbers and the square of the sum. hundred natural numbers and the square of the sum.
""" """
def solution(n: int = 100) -> int: def solution(n: int = 100) -> int:
"""Returns the difference between the sum of the squares of the first n """
Returns the difference between the sum of the squares of the first n
natural numbers and the square of the sum. natural numbers and the square of the sum.
>>> solution(10) >>> solution(10)
@ -27,16 +30,12 @@ def solution(n: int = 100) -> int:
41230 41230
>>> solution(50) >>> solution(50)
1582700 1582700
>>> solution()
25164150
""" """
sum_cubes = (n * (n + 1) // 2) ** 2 sum_cubes = (n * (n + 1) // 2) ** 2
sum_squares = n * (n + 1) * (2 * n + 1) // 6 sum_squares = n * (n + 1) * (2 * n + 1) // 6
return sum_cubes - sum_squares return sum_cubes - sum_squares
if __name__ == "__main__": if __name__ == "__main__":
import doctest print(f"{solution() = }")
doctest.testmod()
print(solution(int(input().strip())))

View File

@ -1,23 +1,26 @@
""" """
Problem 6: https://projecteuler.net/problem=6 Project Euler Problem 6: https://projecteuler.net/problem=6
Sum square difference
The sum of the squares of the first ten natural numbers is, The sum of the squares of the first ten natural numbers is,
1^2 + 2^2 + ... + 10^2 = 385 1^2 + 2^2 + ... + 10^2 = 385
The square of the sum of the first ten natural numbers is, The square of the sum of the first ten natural numbers is,
(1 + 2 + ... + 10)^2 = 552 = 3025 (1 + 2 + ... + 10)^2 = 55^2 = 3025
Hence the difference between the sum of the squares of the first ten natural Hence the difference between the sum of the squares of the first ten
numbers and the square of the sum is 3025 385 = 2640. natural numbers and the square of the sum is 3025 - 385 = 2640.
Find the difference between the sum of the squares of the first N natural Find the difference between the sum of the squares of the first one
numbers and the square of the sum. hundred natural numbers and the square of the sum.
""" """
import math import math
def solution(n: int = 100) -> int: def solution(n: int = 100) -> int:
"""Returns the difference between the sum of the squares of the first n """
Returns the difference between the sum of the squares of the first n
natural numbers and the square of the sum. natural numbers and the square of the sum.
>>> solution(10) >>> solution(10)
@ -28,16 +31,12 @@ def solution(n: int = 100) -> int:
41230 41230
>>> solution(50) >>> solution(50)
1582700 1582700
>>> solution()
25164150
""" """
sum_of_squares = sum([i * i for i in range(1, n + 1)]) sum_of_squares = sum([i * i for i in range(1, n + 1)])
square_of_sum = int(math.pow(sum(range(1, n + 1)), 2)) square_of_sum = int(math.pow(sum(range(1, n + 1)), 2))
return square_of_sum - sum_of_squares return square_of_sum - sum_of_squares
if __name__ == "__main__": if __name__ == "__main__":
import doctest print(f"{solution() = }")
doctest.testmod()
print(solution(int(input().strip())))

View File

@ -1,22 +1,25 @@
""" """
Problem 6: https://projecteuler.net/problem=6 Project Euler Problem 6: https://projecteuler.net/problem=6
Sum square difference
The sum of the squares of the first ten natural numbers is, The sum of the squares of the first ten natural numbers is,
1^2 + 2^2 + ... + 10^2 = 385 1^2 + 2^2 + ... + 10^2 = 385
The square of the sum of the first ten natural numbers is, The square of the sum of the first ten natural numbers is,
(1 + 2 + ... + 10)^2 = 552 = 3025 (1 + 2 + ... + 10)^2 = 55^2 = 3025
Hence the difference between the sum of the squares of the first ten natural Hence the difference between the sum of the squares of the first ten
numbers and the square of the sum is 3025 385 = 2640. natural numbers and the square of the sum is 3025 - 385 = 2640.
Find the difference between the sum of the squares of the first N natural Find the difference between the sum of the squares of the first one
numbers and the square of the sum. hundred natural numbers and the square of the sum.
""" """
def solution(n: int = 100) -> int: def solution(n: int = 100) -> int:
"""Returns the difference between the sum of the squares of the first n """
Returns the difference between the sum of the squares of the first n
natural numbers and the square of the sum. natural numbers and the square of the sum.
>>> solution(10) >>> solution(10)
@ -27,16 +30,12 @@ def solution(n: int = 100) -> int:
41230 41230
>>> solution(50) >>> solution(50)
1582700 1582700
>>> solution()
25164150
""" """
sum_of_squares = n * (n + 1) * (2 * n + 1) / 6 sum_of_squares = n * (n + 1) * (2 * n + 1) / 6
square_of_sum = (n * (n + 1) / 2) ** 2 square_of_sum = (n * (n + 1) / 2) ** 2
return int(square_of_sum - sum_of_squares) return int(square_of_sum - sum_of_squares)
if __name__ == "__main__": if __name__ == "__main__":
import doctest print(f"{solution() = }")
doctest.testmod()
print(solution(int(input("Enter a number: ").strip())))

View File

@ -1,17 +1,34 @@
""" """
Problem 7: https://projecteuler.net/problem=7 Project Euler Problem 7: https://projecteuler.net/problem=7
By listing the first six prime numbers: 10001st prime
2, 3, 5, 7, 11, and 13 By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13, we
can see that the 6th prime is 13.
We can see that the 6th prime is 13. What is the Nth prime number? What is the 10001st prime number?
References:
- https://en.wikipedia.org/wiki/Prime_number
""" """
from math import sqrt from math import sqrt
def is_prime(num: int) -> bool: def is_prime(num: int) -> bool:
"""Determines whether the given number is prime or not""" """
Determines whether the given number is prime or not
>>> is_prime(2)
True
>>> is_prime(15)
False
>>> is_prime(29)
True
>>> is_prime(0)
False
"""
if num == 2: if num == 2:
return True return True
elif num % 2 == 0: elif num % 2 == 0:
@ -25,7 +42,8 @@ def is_prime(num: int) -> bool:
def solution(nth: int = 10001) -> int: def solution(nth: int = 10001) -> int:
"""Returns the n-th prime number. """
Returns the n-th prime number.
>>> solution(6) >>> solution(6)
13 13
@ -39,9 +57,8 @@ def solution(nth: int = 10001) -> int:
229 229
>>> solution(100) >>> solution(100)
541 541
>>> solution()
104743
""" """
count = 0 count = 0
number = 1 number = 1
while count != nth and number < 3: while count != nth and number < 3:
@ -56,4 +73,4 @@ def solution(nth: int = 10001) -> int:
if __name__ == "__main__": if __name__ == "__main__":
print(solution(int(input().strip()))) print(f"{solution() = }")

View File

@ -1,16 +1,30 @@
""" """
Problem 7: https://projecteuler.net/problem=7 Project Euler Problem 7: https://projecteuler.net/problem=7
By listing the first six prime numbers: 10001st prime
2, 3, 5, 7, 11, and 13 By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13, we
can see that the 6th prime is 13.
We can see that the 6th prime is 13. What is the Nth prime number? What is the 10001st prime number?
References:
- https://en.wikipedia.org/wiki/Prime_number
""" """
def isprime(number: int) -> bool: def isprime(number: int) -> bool:
"""Determines whether the given number is prime or not""" """
Determines whether the given number is prime or not
>>> isprime(2)
True
>>> isprime(15)
False
>>> isprime(29)
True
"""
for i in range(2, int(number ** 0.5) + 1): for i in range(2, int(number ** 0.5) + 1):
if number % i == 0: if number % i == 0:
return False return False
@ -18,7 +32,8 @@ def isprime(number: int) -> bool:
def solution(nth: int = 10001) -> int: def solution(nth: int = 10001) -> int:
"""Returns the n-th prime number. """
Returns the n-th prime number.
>>> solution(6) >>> solution(6)
13 13
@ -32,35 +47,32 @@ def solution(nth: int = 10001) -> int:
229 229
>>> solution(100) >>> solution(100)
541 541
>>> solution()
104743
>>> solution(3.4) >>> solution(3.4)
5 5
>>> solution(0) >>> solution(0)
Traceback (most recent call last): Traceback (most recent call last):
... ...
ValueError: Parameter nth must be greater or equal to one. ValueError: Parameter nth must be greater than or equal to one.
>>> solution(-17) >>> solution(-17)
Traceback (most recent call last): Traceback (most recent call last):
... ...
ValueError: Parameter nth must be greater or equal to one. ValueError: Parameter nth must be greater than or equal to one.
>>> solution([]) >>> solution([])
Traceback (most recent call last): Traceback (most recent call last):
... ...
TypeError: Parameter nth must be int or passive of cast to int. TypeError: Parameter nth must be int or castable to int.
>>> solution("asd") >>> solution("asd")
Traceback (most recent call last): Traceback (most recent call last):
... ...
TypeError: Parameter nth must be int or passive of cast to int. TypeError: Parameter nth must be int or castable to int.
""" """
try: try:
nth = int(nth) nth = int(nth)
except (TypeError, ValueError): except (TypeError, ValueError):
raise TypeError( raise TypeError("Parameter nth must be int or castable to int.") from None
"Parameter nth must be int or passive of cast to int."
) from None
if nth <= 0: if nth <= 0:
raise ValueError("Parameter nth must be greater or equal to one.") raise ValueError("Parameter nth must be greater than or equal to one.")
primes = [] primes = []
num = 2 num = 2
while len(primes) < nth: while len(primes) < nth:
@ -73,4 +85,4 @@ def solution(nth: int = 10001) -> int:
if __name__ == "__main__": if __name__ == "__main__":
print(solution(int(input().strip()))) print(f"{solution() = }")

View File

@ -1,24 +1,42 @@
""" """
Project 7: https://projecteuler.net/problem=7 Project Euler Problem 7: https://projecteuler.net/problem=7
By listing the first six prime numbers: 10001st prime
2, 3, 5, 7, 11, and 13 By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13, we
can see that the 6th prime is 13.
We can see that the 6th prime is 13. What is the Nth prime number? What is the 10001st prime number?
References:
- https://en.wikipedia.org/wiki/Prime_number
""" """
import itertools import itertools
import math import math
def prime_check(number: int) -> bool: def prime_check(number: int) -> bool:
"""Determines whether a given number is prime or not""" """
Determines whether a given number is prime or not
>>> prime_check(2)
True
>>> prime_check(15)
False
>>> prime_check(29)
True
"""
if number % 2 == 0 and number > 2: if number % 2 == 0 and number > 2:
return False return False
return all(number % i for i in range(3, int(math.sqrt(number)) + 1, 2)) return all(number % i for i in range(3, int(math.sqrt(number)) + 1, 2))
def prime_generator(): def prime_generator():
"""
Generate a sequence of prime numbers
"""
num = 2 num = 2
while True: while True:
if prime_check(num): if prime_check(num):
@ -27,7 +45,8 @@ def prime_generator():
def solution(nth: int = 10001) -> int: def solution(nth: int = 10001) -> int:
"""Returns the n-th prime number. """
Returns the n-th prime number.
>>> solution(6) >>> solution(6)
13 13
@ -41,11 +60,9 @@ def solution(nth: int = 10001) -> int:
229 229
>>> solution(100) >>> solution(100)
541 541
>>> solution()
104743
""" """
return next(itertools.islice(prime_generator(), nth - 1, nth)) return next(itertools.islice(prime_generator(), nth - 1, nth))
if __name__ == "__main__": if __name__ == "__main__":
print(solution(int(input().strip()))) print(f"{solution() = }")

View File

@ -1,33 +1,36 @@
""" """
Problem 8: https://projecteuler.net/problem=8 Project Euler Problem 8: https://projecteuler.net/problem=8
Largest product in a series
The four adjacent digits in the 1000-digit number that have the greatest The four adjacent digits in the 1000-digit number that have the greatest
product are 9 × 9 × 8 × 9 = 5832. product are 9 × 9 × 8 × 9 = 5832.
73167176531330624919225119674426574742355349194934 73167176531330624919225119674426574742355349194934
96983520312774506326239578318016984801869478851843 96983520312774506326239578318016984801869478851843
85861560789112949495459501737958331952853208805511 85861560789112949495459501737958331952853208805511
12540698747158523863050715693290963295227443043557 12540698747158523863050715693290963295227443043557
66896648950445244523161731856403098711121722383113 66896648950445244523161731856403098711121722383113
62229893423380308135336276614282806444486645238749 62229893423380308135336276614282806444486645238749
30358907296290491560440772390713810515859307960866 30358907296290491560440772390713810515859307960866
70172427121883998797908792274921901699720888093776 70172427121883998797908792274921901699720888093776
65727333001053367881220235421809751254540594752243 65727333001053367881220235421809751254540594752243
52584907711670556013604839586446706324415722155397 52584907711670556013604839586446706324415722155397
53697817977846174064955149290862569321978468622482 53697817977846174064955149290862569321978468622482
83972241375657056057490261407972968652414535100474 83972241375657056057490261407972968652414535100474
82166370484403199890008895243450658541227588666881 82166370484403199890008895243450658541227588666881
16427171479924442928230863465674813919123162824586 16427171479924442928230863465674813919123162824586
17866458359124566529476545682848912883142607690042 17866458359124566529476545682848912883142607690042
24219022671055626321111109370544217506941658960408 24219022671055626321111109370544217506941658960408
07198403850962455444362981230987879927244284909188 07198403850962455444362981230987879927244284909188
84580156166097919133875499200524063689912560717606 84580156166097919133875499200524063689912560717606
05886116467109405077541002256983155200055935729725 05886116467109405077541002256983155200055935729725
71636269561882670428252483600823257530420752963450 71636269561882670428252483600823257530420752963450
Find the thirteen adjacent digits in the 1000-digit number that have the Find the thirteen adjacent digits in the 1000-digit number that have the
greatest product. What is the value of this product? greatest product. What is the value of this product?
""" """
import sys import sys
N = """73167176531330624919225119674426574742355349194934\ N = """73167176531330624919225119674426574742355349194934\
@ -53,12 +56,18 @@ N = """73167176531330624919225119674426574742355349194934\
def solution(n: str = N) -> int: def solution(n: str = N) -> int:
"""Find the thirteen adjacent digits in the 1000-digit number n that have """
Find the thirteen adjacent digits in the 1000-digit number n that have
the greatest product and returns it. the greatest product and returns it.
>>> solution(N) >>> solution("13978431290823798458352374")
23514624000 609638400
>>> solution("13978431295823798458352374")
2612736000
>>> solution("1397843129582379841238352374")
209018880
""" """
largest_product = -sys.maxsize - 1 largest_product = -sys.maxsize - 1
for i in range(len(n) - 12): for i in range(len(n) - 12):
product = 1 product = 1
@ -70,4 +79,4 @@ def solution(n: str = N) -> int:
if __name__ == "__main__": if __name__ == "__main__":
print(solution(N)) print(f"{solution() = }")

View File

@ -1,34 +1,35 @@
""" """
Problem 8: https://projecteuler.net/problem=8 Project Euler Problem 8: https://projecteuler.net/problem=8
Largest product in a series
The four adjacent digits in the 1000-digit number that have the greatest The four adjacent digits in the 1000-digit number that have the greatest
product are 9 × 9 × 8 × 9 = 5832. product are 9 × 9 × 8 × 9 = 5832.
73167176531330624919225119674426574742355349194934 73167176531330624919225119674426574742355349194934
96983520312774506326239578318016984801869478851843 96983520312774506326239578318016984801869478851843
85861560789112949495459501737958331952853208805511 85861560789112949495459501737958331952853208805511
12540698747158523863050715693290963295227443043557 12540698747158523863050715693290963295227443043557
66896648950445244523161731856403098711121722383113 66896648950445244523161731856403098711121722383113
62229893423380308135336276614282806444486645238749 62229893423380308135336276614282806444486645238749
30358907296290491560440772390713810515859307960866 30358907296290491560440772390713810515859307960866
70172427121883998797908792274921901699720888093776 70172427121883998797908792274921901699720888093776
65727333001053367881220235421809751254540594752243 65727333001053367881220235421809751254540594752243
52584907711670556013604839586446706324415722155397 52584907711670556013604839586446706324415722155397
53697817977846174064955149290862569321978468622482 53697817977846174064955149290862569321978468622482
83972241375657056057490261407972968652414535100474 83972241375657056057490261407972968652414535100474
82166370484403199890008895243450658541227588666881 82166370484403199890008895243450658541227588666881
16427171479924442928230863465674813919123162824586 16427171479924442928230863465674813919123162824586
17866458359124566529476545682848912883142607690042 17866458359124566529476545682848912883142607690042
24219022671055626321111109370544217506941658960408 24219022671055626321111109370544217506941658960408
07198403850962455444362981230987879927244284909188 07198403850962455444362981230987879927244284909188
84580156166097919133875499200524063689912560717606 84580156166097919133875499200524063689912560717606
05886116467109405077541002256983155200055935729725 05886116467109405077541002256983155200055935729725
71636269561882670428252483600823257530420752963450 71636269561882670428252483600823257530420752963450
Find the thirteen adjacent digits in the 1000-digit number that have the Find the thirteen adjacent digits in the 1000-digit number that have the
greatest product. What is the value of this product? greatest product. What is the value of this product?
""" """
from functools import reduce from functools import reduce
N = ( N = (
@ -56,12 +57,18 @@ N = (
def solution(n: str = N) -> int: def solution(n: str = N) -> int:
"""Find the thirteen adjacent digits in the 1000-digit number n that have """
Find the thirteen adjacent digits in the 1000-digit number n that have
the greatest product and returns it. the greatest product and returns it.
>>> solution(N) >>> solution("13978431290823798458352374")
23514624000 609638400
>>> solution("13978431295823798458352374")
2612736000
>>> solution("1397843129582379841238352374")
209018880
""" """
return max( return max(
[ [
reduce(lambda x, y: int(x) * int(y), n[i : i + 13]) reduce(lambda x, y: int(x) * int(y), n[i : i + 13])
@ -71,4 +78,4 @@ def solution(n: str = N) -> int:
if __name__ == "__main__": if __name__ == "__main__":
print(solution(str(N))) print(f"{solution() = }")

View File

@ -1,29 +1,31 @@
""" """
Problem 8: https://projecteuler.net/problem=8 Project Euler Problem 8: https://projecteuler.net/problem=8
Largest product in a series
The four adjacent digits in the 1000-digit number that have the greatest The four adjacent digits in the 1000-digit number that have the greatest
product are 9 × 9 × 8 × 9 = 5832. product are 9 × 9 × 8 × 9 = 5832.
73167176531330624919225119674426574742355349194934 73167176531330624919225119674426574742355349194934
96983520312774506326239578318016984801869478851843 96983520312774506326239578318016984801869478851843
85861560789112949495459501737958331952853208805511 85861560789112949495459501737958331952853208805511
12540698747158523863050715693290963295227443043557 12540698747158523863050715693290963295227443043557
66896648950445244523161731856403098711121722383113 66896648950445244523161731856403098711121722383113
62229893423380308135336276614282806444486645238749 62229893423380308135336276614282806444486645238749
30358907296290491560440772390713810515859307960866 30358907296290491560440772390713810515859307960866
70172427121883998797908792274921901699720888093776 70172427121883998797908792274921901699720888093776
65727333001053367881220235421809751254540594752243 65727333001053367881220235421809751254540594752243
52584907711670556013604839586446706324415722155397 52584907711670556013604839586446706324415722155397
53697817977846174064955149290862569321978468622482 53697817977846174064955149290862569321978468622482
83972241375657056057490261407972968652414535100474 83972241375657056057490261407972968652414535100474
82166370484403199890008895243450658541227588666881 82166370484403199890008895243450658541227588666881
16427171479924442928230863465674813919123162824586 16427171479924442928230863465674813919123162824586
17866458359124566529476545682848912883142607690042 17866458359124566529476545682848912883142607690042
24219022671055626321111109370544217506941658960408 24219022671055626321111109370544217506941658960408
07198403850962455444362981230987879927244284909188 07198403850962455444362981230987879927244284909188
84580156166097919133875499200524063689912560717606 84580156166097919133875499200524063689912560717606
05886116467109405077541002256983155200055935729725 05886116467109405077541002256983155200055935729725
71636269561882670428252483600823257530420752963450 71636269561882670428252483600823257530420752963450
Find the thirteen adjacent digits in the 1000-digit number that have the Find the thirteen adjacent digits in the 1000-digit number that have the
greatest product. What is the value of this product? greatest product. What is the value of this product?
@ -53,13 +55,15 @@ N = """73167176531330624919225119674426574742355349194934\
def str_eval(s: str) -> int: def str_eval(s: str) -> int:
"""Returns product of digits in given string n """
Returns product of digits in given string n
>>> str_eval("987654321") >>> str_eval("987654321")
362880 362880
>>> str_eval("22222222") >>> str_eval("22222222")
256 256
""" """
product = 1 product = 1
for digit in s: for digit in s:
product *= int(digit) product *= int(digit)
@ -67,12 +71,11 @@ def str_eval(s: str) -> int:
def solution(n: str = N) -> int: def solution(n: str = N) -> int:
"""Find the thirteen adjacent digits in the 1000-digit number n that have
the greatest product and returns it.
>>> solution(N)
23514624000
""" """
Find the thirteen adjacent digits in the 1000-digit number n that have
the greatest product and returns it.
"""
largest_product = -sys.maxsize - 1 largest_product = -sys.maxsize - 1
substr = n[:13] substr = n[:13]
cur_index = 13 cur_index = 13
@ -88,4 +91,4 @@ def solution(n: str = N) -> int:
if __name__ == "__main__": if __name__ == "__main__":
print(solution(N)) print(f"{solution() = }")

View File

@ -1,26 +1,35 @@
""" """
Problem 9: https://projecteuler.net/problem=9 Project Euler Problem 9: https://projecteuler.net/problem=9
Special Pythagorean triplet
A Pythagorean triplet is a set of three natural numbers, a < b < c, for which, A Pythagorean triplet is a set of three natural numbers, a < b < c, for which,
a^2 + b^2 = c^2 a^2 + b^2 = c^2
For example, 3^2 + 4^2 = 9 + 16 = 25 = 5^2. For example, 3^2 + 4^2 = 9 + 16 = 25 = 5^2.
There exists exactly one Pythagorean triplet for which a + b + c = 1000. There exists exactly one Pythagorean triplet for which a + b + c = 1000.
Find the product abc. Find the product a*b*c.
References:
- https://en.wikipedia.org/wiki/Pythagorean_triple
""" """
def solution() -> int: def solution() -> int:
""" """
Returns the product of a,b,c which are Pythagorean Triplet that satisfies Returns the product of a,b,c which are Pythagorean Triplet that satisfies
the following: the following:
1. a < b < c 1. a < b < c
2. a**2 + b**2 = c**2 2. a**2 + b**2 = c**2
3. a + b + c = 1000 3. a + b + c = 1000
# The code below has been commented due to slow execution affecting Travis. # The code below has been commented due to slow execution affecting Travis.
# >>> solution() # >>> solution()
# 31875000 # 31875000
""" """
for a in range(300): for a in range(300):
for b in range(400): for b in range(400):
for c in range(500): for c in range(500):
@ -32,16 +41,17 @@ def solution() -> int:
def solution_fast() -> int: def solution_fast() -> int:
""" """
Returns the product of a,b,c which are Pythagorean Triplet that satisfies Returns the product of a,b,c which are Pythagorean Triplet that satisfies
the following: the following:
1. a < b < c 1. a < b < c
2. a**2 + b**2 = c**2 2. a**2 + b**2 = c**2
3. a + b + c = 1000 3. a + b + c = 1000
# The code below has been commented due to slow execution affecting Travis. # The code below has been commented due to slow execution affecting Travis.
# >>> solution_fast() # >>> solution_fast()
# 31875000 # 31875000
""" """
for a in range(300): for a in range(300):
for b in range(400): for b in range(400):
c = 1000 - a - b c = 1000 - a - b
@ -66,4 +76,4 @@ def benchmark() -> None:
if __name__ == "__main__": if __name__ == "__main__":
benchmark() print(f"{solution() = }")

View File

@ -1,30 +1,40 @@
""" """
Problem 9: https://projecteuler.net/problem=9 Project Euler Problem 9: https://projecteuler.net/problem=9
Special Pythagorean triplet
A Pythagorean triplet is a set of three natural numbers, a < b < c, for which, A Pythagorean triplet is a set of three natural numbers, a < b < c, for which,
a^2 + b^2 = c^2 a^2 + b^2 = c^2
For example, 3^2 + 4^2 = 9 + 16 = 25 = 5^2. For example, 3^2 + 4^2 = 9 + 16 = 25 = 5^2.
There exists exactly one Pythagorean triplet for which a + b + c = 1000. There exists exactly one Pythagorean triplet for which a + b + c = 1000.
Find the product abc. Find the product a*b*c.
References:
- https://en.wikipedia.org/wiki/Pythagorean_triple
""" """
def solution(n: int = 1000) -> int: def solution(n: int = 1000) -> int:
""" """
Return the product of a,b,c which are Pythagorean Triplet that satisfies Return the product of a,b,c which are Pythagorean Triplet that satisfies
the following: the following:
1. a < b < c 1. a < b < c
2. a**2 + b**2 = c**2 2. a**2 + b**2 = c**2
3. a + b + c = n 3. a + b + c = n
>>> solution(1000) >>> solution(36)
31875000 1620
>>> solution(126)
66780
""" """
product = -1 product = -1
candidate = 0 candidate = 0
for a in range(1, n // 3): for a in range(1, n // 3):
"""Solving the two equations a**2+b**2=c**2 and a+b+c=N eliminating c""" # Solving the two equations a**2+b**2=c**2 and a+b+c=N eliminating c
b = (n * n - 2 * a * n) // (2 * n - 2 * a) b = (n * n - 2 * a * n) // (2 * n - 2 * a)
c = n - a - b c = n - a - b
if c * c == (a * a + b * b): if c * c == (a * a + b * b):
@ -35,4 +45,4 @@ def solution(n: int = 1000) -> int:
if __name__ == "__main__": if __name__ == "__main__":
print(solution(int(input().strip()))) print(f"{solution() = }")

View File

@ -1,5 +1,7 @@
""" """
Problem 9: https://projecteuler.net/problem=9 Project Euler Problem 9: https://projecteuler.net/problem=9
Special Pythagorean triplet
A Pythagorean triplet is a set of three natural numbers, a < b < c, for which, A Pythagorean triplet is a set of three natural numbers, a < b < c, for which,
@ -8,22 +10,25 @@ A Pythagorean triplet is a set of three natural numbers, a < b < c, for which,
For example, 3^2 + 4^2 = 9 + 16 = 25 = 5^2. For example, 3^2 + 4^2 = 9 + 16 = 25 = 5^2.
There exists exactly one Pythagorean triplet for which a + b + c = 1000. There exists exactly one Pythagorean triplet for which a + b + c = 1000.
Find the product abc. Find the product a*b*c.
References:
- https://en.wikipedia.org/wiki/Pythagorean_triple
""" """
def solution() -> int: def solution() -> int:
""" """
Returns the product of a,b,c which are Pythagorean Triplet that satisfies Returns the product of a,b,c which are Pythagorean Triplet that satisfies
the following: the following:
1. a**2 + b**2 = c**2
1. a**2 + b**2 = c**2 2. a + b + c = 1000
2. a + b + c = 1000
# The code below has been commented due to slow execution affecting Travis. # The code below has been commented due to slow execution affecting Travis.
# >>> solution() # >>> solution()
# 31875000 # 31875000
""" """
return [ return [
a * b * (1000 - a - b) a * b * (1000 - a - b)
for a in range(1, 999) for a in range(1, 999)
@ -33,4 +38,4 @@ def solution() -> int:
if __name__ == "__main__": if __name__ == "__main__":
print(solution()) print(f"{solution() = }")

View File

@ -1,16 +1,23 @@
""" """
https://projecteuler.net/problem=10 Project Euler Problem 10: https://projecteuler.net/problem=10
Summation of primes
Problem Statement:
The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17. The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17.
Find the sum of all the primes below two million. Find the sum of all the primes below two million.
References:
- https://en.wikipedia.org/wiki/Prime_number
""" """
from math import sqrt from math import sqrt
def is_prime(n: int) -> bool: def is_prime(n: int) -> bool:
"""Returns boolean representing primality of given number num. """
Returns boolean representing primality of given number num.
>>> is_prime(2) >>> is_prime(2)
True True
>>> is_prime(3) >>> is_prime(3)
@ -20,6 +27,7 @@ def is_prime(n: int) -> bool:
>>> is_prime(2999) >>> is_prime(2999)
True True
""" """
for i in range(2, int(sqrt(n)) + 1): for i in range(2, int(sqrt(n)) + 1):
if n % i == 0: if n % i == 0:
return False return False
@ -28,11 +36,9 @@ def is_prime(n: int) -> bool:
def solution(n: int = 2000000) -> int: def solution(n: int = 2000000) -> int:
"""Returns the sum of all the primes below n. """
Returns the sum of all the primes below n.
# The code below has been commented due to slow execution affecting Travis.
# >>> solution(2000000)
# 142913828922
>>> solution(1000) >>> solution(1000)
76127 76127
>>> solution(5000) >>> solution(5000)
@ -42,6 +48,7 @@ def solution(n: int = 2000000) -> int:
>>> solution(7) >>> solution(7)
10 10
""" """
if n > 2: if n > 2:
sum_of_primes = 2 sum_of_primes = 2
else: else:
@ -55,4 +62,4 @@ def solution(n: int = 2000000) -> int:
if __name__ == "__main__": if __name__ == "__main__":
print(solution(int(input().strip()))) print(f"{solution() = }")

View File

@ -1,10 +1,14 @@
""" """
https://projecteuler.net/problem=10 Project Euler Problem 10: https://projecteuler.net/problem=10
Summation of primes
Problem Statement:
The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17. The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17.
Find the sum of all the primes below two million. Find the sum of all the primes below two million.
References:
- https://en.wikipedia.org/wiki/Prime_number
""" """
import math import math
from itertools import takewhile from itertools import takewhile
@ -12,7 +16,9 @@ from typing import Iterator
def is_prime(number: int) -> bool: def is_prime(number: int) -> bool:
"""Returns boolean representing primality of given number num. """
Returns boolean representing primality of given number num.
>>> is_prime(2) >>> is_prime(2)
True True
>>> is_prime(3) >>> is_prime(3)
@ -22,12 +28,17 @@ def is_prime(number: int) -> bool:
>>> is_prime(2999) >>> is_prime(2999)
True True
""" """
if number % 2 == 0 and number > 2: if number % 2 == 0 and number > 2:
return False return False
return all(number % i for i in range(3, int(math.sqrt(number)) + 1, 2)) return all(number % i for i in range(3, int(math.sqrt(number)) + 1, 2))
def prime_generator() -> Iterator[int]: def prime_generator() -> Iterator[int]:
"""
Generate a list sequence of prime numbers
"""
num = 2 num = 2
while True: while True:
if is_prime(num): if is_prime(num):
@ -36,11 +47,9 @@ def prime_generator() -> Iterator[int]:
def solution(n: int = 2000000) -> int: def solution(n: int = 2000000) -> int:
"""Returns the sum of all the primes below n. """
Returns the sum of all the primes below n.
# The code below has been commented due to slow execution affecting Travis.
# >>> solution(2000000)
# 142913828922
>>> solution(1000) >>> solution(1000)
76127 76127
>>> solution(5000) >>> solution(5000)
@ -50,8 +59,9 @@ def solution(n: int = 2000000) -> int:
>>> solution(7) >>> solution(7)
10 10
""" """
return sum(takewhile(lambda x: x < n, prime_generator())) return sum(takewhile(lambda x: x < n, prime_generator()))
if __name__ == "__main__": if __name__ == "__main__":
print(solution(int(input().strip()))) print(f"{solution() = }")

View File

@ -1,43 +1,47 @@
""" """
https://projecteuler.net/problem=10 Project Euler Problem 10: https://projecteuler.net/problem=10
Summation of primes
Problem Statement:
The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17. The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17.
Find the sum of all the primes below two million. Find the sum of all the primes below two million.
References:
- https://en.wikipedia.org/wiki/Prime_number
- https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes
""" """
def solution(n: int = 2000000) -> int: def solution(n: int = 2000000) -> int:
"""Returns the sum of all the primes below n using Sieve of Eratosthenes: """
Returns the sum of all the primes below n using Sieve of Eratosthenes:
https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes
The sieve of Eratosthenes is one of the most efficient ways to find all primes The sieve of Eratosthenes is one of the most efficient ways to find all primes
smaller than n when n is smaller than 10 million. Only for positive numbers. smaller than n when n is smaller than 10 million. Only for positive numbers.
>>> solution(2_000_000) >>> solution(1000)
142913828922
>>> solution(1_000)
76127 76127
>>> solution(5_000) >>> solution(5000)
1548136 1548136
>>> solution(10_000) >>> solution(10000)
5736396 5736396
>>> solution(7) >>> solution(7)
10 10
>>> solution(7.1) # doctest: +ELLIPSIS >>> solution(7.1) # doctest: +ELLIPSIS
Traceback (most recent call last): Traceback (most recent call last):
... ...
TypeError: 'float' object cannot be interpreted as an integer TypeError: 'float' object cannot be interpreted as an integer
>>> solution(-7) # doctest: +ELLIPSIS >>> solution(-7) # doctest: +ELLIPSIS
Traceback (most recent call last): Traceback (most recent call last):
... ...
IndexError: list assignment index out of range IndexError: list assignment index out of range
>>> solution("seven") # doctest: +ELLIPSIS >>> solution("seven") # doctest: +ELLIPSIS
Traceback (most recent call last): Traceback (most recent call last):
... ...
TypeError: can only concatenate str (not "int") to str TypeError: can only concatenate str (not "int") to str
""" """
primality_list = [0 for i in range(n + 1)] primality_list = [0 for i in range(n + 1)]
primality_list[0] = 1 primality_list[0] = 1
primality_list[1] = 1 primality_list[1] = 1
@ -54,4 +58,4 @@ def solution(n: int = 2000000) -> int:
if __name__ == "__main__": if __name__ == "__main__":
print(solution(int(input().strip()))) print(f"{solution() = }")