''' > https://www.codingame.com/ide/puzzle/nature-of-quadrilaterals @author: olivier.massot, 2019 ''' import math import sys class Vertex(): def __init__(self, name_, x, y): self.name = name_ self.x = int(x) self.y = int(y) self.pos = (self.x, self.y) def __repr__(self): return f"{self.name}{self.pos}" class Side(): def __init__(self, v1, v2): self.v1 = v1 self.v2 = v2 self.sqlength = (v2.x - v1.x)**2 + (v2.y - v1.y)**2 self.a = (v2.x - v1.x) / (v2.y - v1.y) if v2.y != v1.y else (v2.x - v1.x) * math.inf self.b = -1 * self.a * v2.x + v2.y def ortho_to(self, s): if abs(self.a) == math.inf and s.a == 0: return True elif self.a == 0 and abs(s.a) == math.inf: return True elif self.a * s.a == -1: return True return False class Quadri(): def __init__(self, *vertices): self.vertices = [Vertex(*v) for v in vertices] self.name = "".join([v.name for v in self.vertices]) self.sides = [Side(v1, v2) for v1, v2 in list(zip(self.vertices, self.vertices[1:])) + [(self.vertices[-1], self.vertices[0])]] def __repr__(self): return f"" def nature(self): opposites_parallels = (abs(self.sides[0].a) == abs(self.sides[2].a) and \ (abs(self.sides[1].a) == abs(self.sides[3].a))) same_length_sides = all([s.sqlength == self.sides[0].sqlength for s in self.sides[1:]]) 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]) if right_angles and same_length_sides: return "square" elif right_angles: return "rectangle" elif same_length_sides: return "rhombus" elif opposites_parallels: return "parallelogram" else: return "quadrilateral" input_ = [input().split() for _ in range(int(input()))] quadris = [Quadri(*zip(l[::3], l[1::3], l[2::3])) for l in input_] print(quadris, file=sys.stderr) for q in quadris: print(f"{q.name} is a {q.nature()}.")