Python 97 (sem pontos complexos)
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]))
Isso pega listas de tuplas de pontos em [(x, y), (x, y), (x, y), (x, y)] em qualquer ordem e pode lidar com duplicatas ou com o número errado de pontos. NÃO requer pontos complexos, como as outras respostas em python.
Você pode testá-lo assim:
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)
Isso vai exigir um pouco de explicação, mas a ideia geral é que existem apenas três distâncias entre os pontos em um quadrado (Lateral, Diagonal, Zero (ponto comparado a ele mesmo)):
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 obter uma lista p de tuplas (x, y)
- Remova as duplicatas usando o conjunto (p) e teste o comprimento
- Obtenha todas as combinações de pontos (a, b em p para c, d em p)
- Obter lista da distância de cada ponto a qualquer outro ponto
- Use set para verificar se existem apenas três distâncias únicas - Zero (ponto comparado com ele mesmo) - Comprimento lateral - Comprimento diagonal
Para salvar os caracteres de código, eu sou:
- usando um nome de função de 1 caractere
- usando uma definição de função de 1 linha
- Em vez de verificar se o número de pontos únicos é 4, eu verifico se -1 possui diferentes comprimentos de pontos (salva == 3 ==)
- use descompactar lista e tupla para obter a, b em p para c, d em p, em vez de usar a [0], a [1]
- usa pow (x, .5) em vez de incluir matemática para obter sqrt (x)
- não colocando espaços após o)
- não colocando um zero à esquerda no flutuador
Receio que alguém possa encontrar um caso de teste que quebre isso. Então, por favor, faça e eu corrijo. Por exemplo, o fato de verificar apenas três distâncias, em vez de fazer um abs () e verificar o comprimento do lado e a hipotenusa, parece um erro.
Primeira vez que experimentei código de golfe. Seja gentil se eu violar alguma regra da casa.