Skip to content

[Project Euler] Added type hints and refactored the code a bit for Problem 14 #3047

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
19 changes: 9 additions & 10 deletions project_euler/problem_14/sol1.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
"""
Problem 14: https://projecteuler.net/problem=14

Problem Statement:
The following iterative sequence is defined for the set of positive integers:

Expand All @@ -17,21 +19,21 @@
"""


def solution(n):
def solution(n: int = 1000000) -> int:
"""Returns the number under n that generates the longest sequence using the
formula:
n → n/2 (n is even)
n → 3n + 1 (n is odd)

# The code below has been commented due to slow execution affecting Travis.
# >>> solution(1000000)
# {'counter': 525, 'largest_number': 837799}
# 837799
>>> solution(200)
{'counter': 125, 'largest_number': 171}
171
>>> solution(5000)
{'counter': 238, 'largest_number': 3711}
3711
>>> solution(15000)
{'counter': 276, 'largest_number': 13255}
13255
"""
largest_number = 0
pre_counter = 0
Expand All @@ -51,11 +53,8 @@ def solution(n):
if counter > pre_counter:
largest_number = input1
pre_counter = counter
return {"counter": pre_counter, "largest_number": largest_number}
return largest_number


if __name__ == "__main__":
result = solution(int(input().strip()))
print(
("Largest Number:", result["largest_number"], "->", result["counter"], "digits")
)
print(solution(int(input().strip())))
23 changes: 11 additions & 12 deletions project_euler/problem_14/sol2.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
"""
Problem 14: https://projecteuler.net/problem=14

Collatz conjecture: start with any positive integer n. Next term obtained from
the previous term as follows:

Expand All @@ -23,9 +25,10 @@

Which starting number, under one million, produces the longest chain?
"""
from typing import List


def collatz_sequence(n):
def collatz_sequence(n: int) -> List[int]:
"""Returns the Collatz sequence for n."""
sequence = [n]
while n != 1:
Expand All @@ -37,27 +40,23 @@ def collatz_sequence(n):
return sequence


def solution(n):
def solution(n: int = 1000000) -> int:
"""Returns the number under n that generates the longest Collatz sequence.

# The code below has been commented due to slow execution affecting Travis.
# >>> solution(1000000)
# {'counter': 525, 'largest_number': 837799}
# 837799
>>> solution(200)
{'counter': 125, 'largest_number': 171}
171
>>> solution(5000)
{'counter': 238, 'largest_number': 3711}
3711
>>> solution(15000)
{'counter': 276, 'largest_number': 13255}
13255
"""

result = max([(len(collatz_sequence(i)), i) for i in range(1, n)])
return {"counter": result[0], "largest_number": result[1]}
return result[1]


if __name__ == "__main__":
result = solution(int(input().strip()))
print(
"Longest Collatz sequence under one million is %d with length %d"
% (result["largest_number"], result["counter"])
)
print(solution(int(input().strip())))