52 lines
1.3 KiB
Python
52 lines
1.3 KiB
Python
|
from math import acos, sqrt, pi, atan
|
||
|
import matplotlib.pyplot as plt
|
||
|
|
||
|
|
||
|
def triangle(euler_text_line):
|
||
|
ps = list(map(int, euler_text_line.split(",")))
|
||
|
ps = [(ps[0], ps[1]), (ps[2], ps[3]), (ps[4], ps[5])]
|
||
|
return ps
|
||
|
|
||
|
|
||
|
def angle_x(x, y):
|
||
|
if x > 0 and y == 0:
|
||
|
return 0
|
||
|
elif x < 0 and y == 0:
|
||
|
return pi
|
||
|
elif x == 0 and y > 0:
|
||
|
return pi / 2
|
||
|
elif x == 0 and y < 0:
|
||
|
return 3 / 2 * pi
|
||
|
elif x > 0 and y > 0:
|
||
|
return atan(y / x)
|
||
|
elif x < 0 and y > 0:
|
||
|
return pi - atan(y / abs(x))
|
||
|
elif x < 0 and y < 0:
|
||
|
return pi + atan(abs(y) / abs(x))
|
||
|
elif x > 0 and y < 0:
|
||
|
return 2 * pi - atan(abs(y) / x)
|
||
|
else:
|
||
|
raise Exception("Unhandled case")
|
||
|
|
||
|
|
||
|
def contains_origin(triangle):
|
||
|
a, b, c = triangle
|
||
|
angles = sorted([angle_x(*a), angle_x(*b), angle_x(*c)])
|
||
|
a = angles[1] - angles[0]
|
||
|
b = angles[2] - angles[1]
|
||
|
c = angles[0] + 2 * pi - angles[2]
|
||
|
return not (a + b < pi or b + c < pi or c + a < pi)
|
||
|
|
||
|
|
||
|
def euler_102():
|
||
|
with open("../txt/e102.txt", "r") as f:
|
||
|
triangles = list(map(triangle, f.readlines()))
|
||
|
return len([1 for t in triangles if contains_origin(t)])
|
||
|
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
solution = euler_102()
|
||
|
print("e102.py: " + str(solution))
|
||
|
assert(solution == 228)
|
||
|
|