From 729aaf64275c61b8bc864ef9138eed078dea9cb2 Mon Sep 17 00:00:00 2001 From: Maxim Smolskiy Date: Thu, 4 Nov 2021 19:01:21 +0300 Subject: [PATCH] Improve Project Euler problem 014 solution 2 (#5744) * Improve solution * Uncomment code that has been commented due to slow execution affecting Travis * Fix * scikit-fuzzy is causing broken builds * fuzz = None * Update fuzzy_operations.py Co-authored-by: Christian Clauss --- fuzzy_logic/fuzzy_operations.py | 9 +++++++-- project_euler/problem_014/sol2.py | 22 ++++++++++++---------- requirements.txt | 2 +- 3 files changed, 20 insertions(+), 13 deletions(-) diff --git a/fuzzy_logic/fuzzy_operations.py b/fuzzy_logic/fuzzy_operations.py index 0f573f1..fbaca94 100644 --- a/fuzzy_logic/fuzzy_operations.py +++ b/fuzzy_logic/fuzzy_operations.py @@ -1,4 +1,5 @@ -"""README, Author - Jigyasa Gandhi(mailto:jigsgandhi97@gmail.com) +""" +README, Author - Jigyasa Gandhi(mailto:jigsgandhi97@gmail.com) Requirements: - scikit-fuzzy - numpy @@ -7,7 +8,11 @@ Python: - 3.5 """ import numpy as np -import skfuzzy as fuzz + +try: + import skfuzzy as fuzz +except ImportError: + fuzz = None if __name__ == "__main__": # Create universe of discourse in Python using linspace () diff --git a/project_euler/problem_014/sol2.py b/project_euler/problem_014/sol2.py index 0a58f8d..d2a1d9f 100644 --- a/project_euler/problem_014/sol2.py +++ b/project_euler/problem_014/sol2.py @@ -27,25 +27,27 @@ Which starting number, under one million, produces the longest chain? """ from __future__ import annotations +COLLATZ_SEQUENCE_LENGTHS = {1: 1} + def collatz_sequence_length(n: int) -> int: """Returns the Collatz sequence length for n.""" - sequence_length = 1 - while n != 1: - if n % 2 == 0: - n //= 2 - else: - n = 3 * n + 1 - sequence_length += 1 + if n in COLLATZ_SEQUENCE_LENGTHS: + return COLLATZ_SEQUENCE_LENGTHS[n] + if n % 2 == 0: + next_n = n // 2 + else: + next_n = 3 * n + 1 + sequence_length = collatz_sequence_length(next_n) + 1 + COLLATZ_SEQUENCE_LENGTHS[n] = sequence_length return sequence_length 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) - # 837799 + >>> solution(1000000) + 837799 >>> solution(200) 171 >>> solution(5000) diff --git a/requirements.txt b/requirements.txt index ef4e180..e01d87c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -9,7 +9,7 @@ pandas pillow qiskit requests -scikit-fuzzy +# scikit-fuzzy # Causing broken builds sklearn statsmodels sympy -- GitLab