quadrilaterals.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. '''
  2. > https://www.codingame.com/ide/puzzle/nature-of-quadrilaterals
  3. @author: olivier.massot, 2019
  4. '''
  5. import math
  6. import sys
  7. class Vertex():
  8. def __init__(self, name_, x, y):
  9. self.name = name_
  10. self.x = int(x)
  11. self.y = int(y)
  12. self.pos = (self.x, self.y)
  13. def __repr__(self):
  14. return f"{self.name}{self.pos}"
  15. class Side():
  16. def __init__(self, v1, v2):
  17. self.v1 = v1
  18. self.v2 = v2
  19. self.sqlength = (v2.x - v1.x)**2 + (v2.y - v1.y)**2
  20. self.a = (v2.x - v1.x) / (v2.y - v1.y) if v2.y != v1.y else (v2.x - v1.x) * math.inf
  21. self.b = -1 * self.a * v2.x + v2.y
  22. def ortho_to(self, s):
  23. if abs(self.a) == math.inf and s.a == 0:
  24. return True
  25. elif self.a == 0 and abs(s.a) == math.inf:
  26. return True
  27. elif self.a * s.a == -1:
  28. return True
  29. return False
  30. class Quadri():
  31. def __init__(self, *vertices):
  32. self.vertices = [Vertex(*v) for v in vertices]
  33. self.name = "".join([v.name for v in self.vertices])
  34. self.sides = [Side(v1, v2) for v1, v2 in list(zip(self.vertices, self.vertices[1:])) + [(self.vertices[-1], self.vertices[0])]]
  35. def __repr__(self):
  36. return f"<Q:{self.vertices}>"
  37. def nature(self):
  38. opposites_parallels = (abs(self.sides[0].a) == abs(self.sides[2].a) and \
  39. (abs(self.sides[1].a) == abs(self.sides[3].a)))
  40. same_length_sides = all([s.sqlength == self.sides[0].sqlength for s in self.sides[1:]])
  41. right_angles = self.sides[0].ortho_to(self.sides[1]) and self.sides[1].ortho_to(self.sides[2]) and self.sides[2].ortho_to(self.sides[3])
  42. if right_angles and same_length_sides:
  43. return "square"
  44. elif right_angles:
  45. return "rectangle"
  46. elif same_length_sides:
  47. return "rhombus"
  48. elif opposites_parallels:
  49. return "parallelogram"
  50. else:
  51. return "quadrilateral"
  52. input_ = [input().split() for _ in range(int(input()))]
  53. quadris = [Quadri(*zip(l[::3], l[1::3], l[2::3])) for l in input_]
  54. print(quadris, file=sys.stderr)
  55. for q in quadris:
  56. print(f"{q.name} is a {q.nature()}.")