Python 97 (sans points complexes)
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]))
Cela prendra des listes de tuples de points dans [(x, y), (x, y), (x, y), (x, y)] dans n'importe quel ordre, et peut gérer les doublons ou le mauvais nombre de points. Il ne nécessite PAS de points complexes comme les autres réponses python.
Vous pouvez le tester comme ceci:
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)
Cela prendra un peu d'explication, mais l'idée générale est qu'il n'y a que trois distances entre les points d'un carré (Side, Diagonal, Zero (point par rapport à lui-même)):
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]))
- pour une liste p de tuples (x, y)
- Supprimez les doublons à l'aide de set (p), puis testez la longueur
- Obtenez chaque combinaison de points (a, b en p pour c, d en p)
- Obtenez la liste de la distance de chaque point à chaque autre point
- Utilisez l'ensemble pour vérifier qu'il n'y a que trois distances uniques - Zéro (point par rapport à lui-même) - Longueur latérale - Longueur diagonale
Pour enregistrer les caractères du code, je suis:
- en utilisant un nom de fonction de 1 caractère
- en utilisant une définition de fonction 1 ligne
- Au lieu de vérifier que le nombre de points uniques est de 4, je vérifie qu'il vaut -1 les différentes longueurs de points (sauvegarde == 3 ==)
- utilisez la décompression de liste et de tuple pour obtenir a, b en p pour c, d en p, au lieu d'utiliser a [0], a [1]
- utilise pow (x, .5) au lieu d'inclure des mathématiques pour obtenir sqrt (x)
- ne pas mettre d'espaces après le)
- ne pas mettre un zéro de tête sur le flotteur
Je crains que quelqu'un ne trouve un test qui casse cela. Alors s'il vous plaît, faites-le et je vais corriger. Par exemple, le fait que je vérifie simplement trois distances, au lieu de faire un abs () et de vérifier la longueur du côté et l'hypoténuse, semble être une erreur.
La première fois que j'ai essayé le golf à code. Soyez gentil si j'ai enfreint les règles de la maison.