euler/python/e102.py

52 lines
1.3 KiB
Python
Raw Normal View History

2021-06-09 22:16:15 +02:00
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)