From 9a32f0b46cbbfca72e72537c1ba96318819ddb8e Mon Sep 17 00:00:00 2001 From: Kushagra Bansal Date: Tue, 18 Aug 2020 16:19:02 +0530 Subject: [PATCH] Created problem_39 in project_euler (#2330) * Create __init__.py * Add files via upload * Update sol1.py * Update sol1.py * Update project_euler/problem_39/sol1.py Co-authored-by: Christian Clauss * Update sol1.py Co-authored-by: Christian Clauss --- project_euler/problem_39/__init__.py | 1 + project_euler/problem_39/sol1.py | 39 ++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 project_euler/problem_39/__init__.py create mode 100644 project_euler/problem_39/sol1.py diff --git a/project_euler/problem_39/__init__.py b/project_euler/problem_39/__init__.py new file mode 100644 index 000000000..792d60054 --- /dev/null +++ b/project_euler/problem_39/__init__.py @@ -0,0 +1 @@ +# diff --git a/project_euler/problem_39/sol1.py b/project_euler/problem_39/sol1.py new file mode 100644 index 000000000..5c21d4bec --- /dev/null +++ b/project_euler/problem_39/sol1.py @@ -0,0 +1,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} + +For which value of p ≤ 1000, is the number of solutions maximised? +""" + +from typing import Dict +from collections import Counter + + +def pythagorean_triple(max_perimeter: int) -> Dict: + """ + Returns a dictionary with keys as the perimeter of a right angled triangle + and value as the number of corresponding triplets. + >>> pythagorean_triple(15) + Counter({12: 1}) + >>> pythagorean_triple(40) + Counter({12: 1, 30: 1, 24: 1, 40: 1, 36: 1}) + >>> pythagorean_triple(50) + Counter({12: 1, 30: 1, 24: 1, 40: 1, 36: 1, 48: 1}) + """ + triplets = Counter() + 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)): + perimeter = int(base + perpendicular + hypotenuse) + if perimeter > max_perimeter: + continue + else: + triplets[perimeter] += 1 + return triplets + + +if __name__ == "__main__": + triplets = pythagorean_triple(1000) + print(f"{triplets.most_common()[0][0] = }")