Python 97 (без сложных точек)
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]))
Это будет принимать списки точечных кортежей в [(x, y), (x, y), (x, y), (x, y)] в любом порядке и может обрабатывать дубликаты или неверное количество точек. Это НЕ требует сложных точек, как и другие ответы Python.
Вы можете проверить это так:
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)
Это потребует небольшого объяснения, но общая идея заключается в том, что между точками в квадрате есть только три расстояния (сторона, диагональ, ноль (точка по сравнению с самим собой)):
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]))
- для списка p кортежей (x, y)
- Удалите дубликаты, используя set (p), а затем проверьте длину
- Получить каждую комбинацию точек (a, b в p для c, d в p)
- Получить список расстояния от каждой точки до любой другой точки
- Используйте набор, чтобы проверить, что есть только три уникальных расстояния - ноль (точка по сравнению с самим собой) - длина стороны - длина диагонали
Для сохранения символов кода я:
- используя имя функции с 1 символом
- используя 1-строчное определение функции
- Вместо того, чтобы проверять количество уникальных точек, равное 4, я проверяю, что это -1 различных длин точек (сохраняет == 3 ==)
- используйте распаковку списков и кортежей, чтобы получить a, b в p для c, d в p вместо использования [0], a [1]
- использует pow (x, .5) вместо включения математики для получения sqrt (x)
- не ставить пробелы после)
- не ставить ведущий ноль на поплавок
Я боюсь, что кто-то может найти контрольный пример, который сломает это. Так что, пожалуйста, и я исправлю. Например, тот факт, что я просто проверяю три расстояния, вместо того, чтобы выполнять abs () и проверку длины стороны и гипотенузы, кажется ошибкой.
Я впервые попробовал код гольф. Будь добр, если я нарушил какие-либо правила дома.