Python 97 (sin puntos complejos)
def t(p):return len(set(p))-1==len(set([pow(pow(a-c,2)+pow(b-d,2),.5)for a,b in p for c,d in p]))
Esto tomará listas de tuplas de puntos en [(x, y), (x, y), (x, y), (x, y)] en cualquier orden, y puede manejar duplicados o el número incorrecto de puntos. NO requiere puntos complejos como las otras respuestas de Python.
Puedes probarlo así:
S1 = [(0,0),(1,0),(1,1),(0,1)] # standard square
S2 = [(0,0),(2,1),(3,-1),(1,-2)] # non-axis-aligned square
S3 = [(0,0),(1,1),(0,1),(1,0)] # different order
S4 = [(0,0),(2,2),(0,2),(2,0)] #
S5 = [(0,0),(2,2),(0,2),(2,0),(0,0)] #Redundant points
B1 = [(0,0),(0,2),(3,2),(3,0)] # rectangle
B2 = [(0,0),(3,4),(8,4),(5,0)] # rhombus
B3 = [(0,0),(0,0),(1,1),(0,0)] # only 2 distinct points
B4 = [(0,0),(0,0),(1,0),(0,1)] # only 3 distinct points
B5 = [(1,1),(2,2),(3,3),(4,4)] # Points on the same line
B6 = [(0,0),(2,2),(0,2)] # Not enough points
def tests(f):
assert(f(S1) == True)
assert(f(S2) == True)
assert(f(S3) == True)
assert(f(S4) == True)
assert(f(S5) == True)
assert(f(B1) == False)
assert(f(B2) == False)
assert(f(B3) == False)
assert(f(B4) == False)
assert(f(B5) == False)
assert(f(B6) == False)
def t(p):return len(set(p))-1==len(set([pow(pow(a-c,2)+pow(b-d,2),.5)for a,b in p for c,d in p]))
tests(t)
Esto requerirá una pequeña explicación, pero la idea general es que solo hay tres distancias entre los puntos en un cuadrado (lateral, diagonal, cero (punto en comparación con sí mismo)):
def t(p):return len(set(p))-1==len(set([pow(pow(a-c,2)+pow(b-d,2),.5)for a,b in p for c,d in p]))
- para una lista p de tuplas (x, y)
- Elimine los duplicados con el conjunto (p) y luego pruebe la longitud
- Obtenga todas las combinaciones de puntos (a, b en p para c, d en p)
- Obtenga una lista de la distancia desde cada punto a cualquier otro punto
- Use el set para verificar que solo haya tres distancias únicas: cero (punto en comparación con sí mismo), longitud lateral, longitud diagonal
Para guardar caracteres de código soy:
- usando un nombre de función 1 char
- utilizando una definición de función de 1 línea
- En lugar de verificar que el número de puntos únicos es 4, verifico que es -1 las diferentes longitudes de puntos (guarda == 3 ==)
- use el desempaquetado de listas y tuplas para obtener a, b en p para c, d en p, en lugar de usar a [0], a [1]
- usa pow (x, .5) en lugar de incluir matemáticas para obtener sqrt (x)
- no poner espacios después del)
- no poner un cero a la izquierda en el flotador
Me temo que alguien puede encontrar un caso de prueba que rompa esto. Así que por favor hazlo y lo corregiré. Por ejemplo, el hecho de que solo verifique tres distancias, en lugar de hacer un abs () y verificar la longitud del lado y la hipotenusa, parece un error.
La primera vez que probé el código de golf. Sé amable si he roto las reglas de la casa.