From 8ddd7c2f7e421c2fd18c90b03ea2442b22afa060 Mon Sep 17 00:00:00 2001 From: fa1l Date: Thu, 8 Oct 2020 09:12:05 +0500 Subject: [PATCH 1/4] improvements for project euler task 39 --- project_euler/problem_39/sol1.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/project_euler/problem_39/sol1.py b/project_euler/problem_39/sol1.py index 79fa309f01c5..b9aecd5c0285 100644 --- a/project_euler/problem_39/sol1.py +++ b/project_euler/problem_39/sol1.py @@ -1,4 +1,6 @@ """ +https://projecteuler.net/problem=39 + 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. {20,48,52}, {24,45,51}, {30,40,50} @@ -8,10 +10,11 @@ from __future__ import annotations +import typing from collections import Counter -def pythagorean_triple(max_perimeter: int) -> dict: +def pythagorean_triple(max_perimeter: int) -> typing.Counter[int]: """ Returns a dictionary with keys as the perimeter of a right angled triangle and value as the number of corresponding triplets. @@ -22,7 +25,7 @@ def pythagorean_triple(max_perimeter: int) -> dict: >>> pythagorean_triple(50) Counter({12: 1, 30: 1, 24: 1, 40: 1, 36: 1, 48: 1}) """ - triplets = Counter() + triplets: typing.Counter[int] = Counter() for base in range(1, max_perimeter + 1): for perpendicular in range(base, max_perimeter + 1): hypotenuse = (base * base + perpendicular * perpendicular) ** 0.5 @@ -35,6 +38,13 @@ def pythagorean_triple(max_perimeter: int) -> dict: return triplets +def solution(n: int = 1000) -> int: + """Returns perimeter with maximum solutions.""" + triplets = pythagorean_triple(n) + perimeter, _ = triplets.most_common()[0] + return perimeter + + if __name__ == "__main__": - triplets = pythagorean_triple(1000) - print(f"{triplets.most_common()[0][0] = }") + result = solution(1000) + print(f"Perimiter {result} has maximum solutions") From 48207f830fdf45dde294d16b82ebfebda8de93f5 Mon Sep 17 00:00:00 2001 From: fa1l Date: Thu, 8 Oct 2020 14:23:32 +0500 Subject: [PATCH 2/4] add tests for solution() --- project_euler/problem_39/sol1.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/project_euler/problem_39/sol1.py b/project_euler/problem_39/sol1.py index b9aecd5c0285..2faeb314929c 100644 --- a/project_euler/problem_39/sol1.py +++ b/project_euler/problem_39/sol1.py @@ -39,9 +39,17 @@ def pythagorean_triple(max_perimeter: int) -> typing.Counter[int]: def solution(n: int = 1000) -> int: - """Returns perimeter with maximum solutions.""" + """ + Returns perimeter with maximum solutions. + >>> solution(100) + 90 + >>> solution(200) + 180 + >>> solution(1000) + 840 + """ triplets = pythagorean_triple(n) - perimeter, _ = triplets.most_common()[0] + perimeter, _ = triplets.most_common(1)[0] return perimeter From 4194972e3e786fe492cce7e2f7599134433c63be Mon Sep 17 00:00:00 2001 From: fa1l Date: Thu, 8 Oct 2020 14:26:48 +0500 Subject: [PATCH 3/4] fixed a typo --- project_euler/problem_39/sol1.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project_euler/problem_39/sol1.py b/project_euler/problem_39/sol1.py index 2faeb314929c..7530fd778713 100644 --- a/project_euler/problem_39/sol1.py +++ b/project_euler/problem_39/sol1.py @@ -55,4 +55,4 @@ def solution(n: int = 1000) -> int: if __name__ == "__main__": result = solution(1000) - print(f"Perimiter {result} has maximum solutions") + print(f"Perimeter {result} has maximum solutions") From 9cc0d94dd4da666c231a08b9347bb4ef85316abf Mon Sep 17 00:00:00 2001 From: Dhruv Date: Fri, 9 Oct 2020 08:06:56 +0530 Subject: [PATCH 4/4] Update sol1.py --- project_euler/problem_39/sol1.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/project_euler/problem_39/sol1.py b/project_euler/problem_39/sol1.py index 7530fd778713..c8ffa8934159 100644 --- a/project_euler/problem_39/sol1.py +++ b/project_euler/problem_39/sol1.py @@ -1,5 +1,5 @@ """ -https://projecteuler.net/problem=39 +Problem 39: https://projecteuler.net/problem=39 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. @@ -29,12 +29,11 @@ def pythagorean_triple(max_perimeter: int) -> typing.Counter[int]: for base in range(1, max_perimeter + 1): for perpendicular in range(base, max_perimeter + 1): hypotenuse = (base * base + perpendicular * perpendicular) ** 0.5 - if hypotenuse == int((hypotenuse)): + if hypotenuse == int(hypotenuse): perimeter = int(base + perpendicular + hypotenuse) if perimeter > max_perimeter: continue - else: - triplets[perimeter] += 1 + triplets[perimeter] += 1 return triplets @@ -49,10 +48,8 @@ def solution(n: int = 1000) -> int: 840 """ triplets = pythagorean_triple(n) - perimeter, _ = triplets.most_common(1)[0] - return perimeter + return triplets.most_common(1)[0][0] if __name__ == "__main__": - result = solution(1000) - print(f"Perimeter {result} has maximum solutions") + print(f"Perimeter {solution()} has maximum solutions")