- Notifications
You must be signed in to change notification settings - Fork 46.7k
/
Copy pathsol1.py
58 lines (48 loc) · 1.64 KB
/
sol1.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
"""
Project Euler Problem 91: https://projecteuler.net/problem=91
The points P (x1, y1) and Q (x2, y2) are plotted at integer coordinates and
are joined to the origin, O(0,0), to form ΔOPQ.

There are exactly fourteen triangles containing a right angle that can be formed
when each coordinate lies between 0 and 2 inclusive; that is,
0 ≤ x1, y1, x2, y2 ≤ 2.

Given that 0 ≤ x1, y1, x2, y2 ≤ 50, how many right triangles can be formed?
"""
fromitertoolsimportcombinations, product
defis_right(x1: int, y1: int, x2: int, y2: int) ->bool:
"""
Check if the triangle described by P(x1,y1), Q(x2,y2) and O(0,0) is right-angled.
Note: this doesn't check if P and Q are equal, but that's handled by the use of
itertools.combinations in the solution function.
>>> is_right(0, 1, 2, 0)
True
>>> is_right(1, 0, 2, 2)
False
"""
ifx1==y1==0orx2==y2==0:
returnFalse
a_square=x1*x1+y1*y1
b_square=x2*x2+y2*y2
c_square= (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2)
return (
a_square+b_square==c_square
ora_square+c_square==b_square
orb_square+c_square==a_square
)
defsolution(limit: int=50) ->int:
"""
Return the number of right triangles OPQ that can be formed by two points P, Q
which have both x- and y- coordinates between 0 and limit inclusive.
>>> solution(2)
14
>>> solution(10)
448
"""
returnsum(
1
forpt1, pt2incombinations(product(range(limit+1), repeat=2), 2)
ifis_right(*pt1, *pt2)
)
if__name__=="__main__":
print(f"{solution() =}")