# 【每日一题1112】正方形坐标
def is_square(input_l: list) -> bool:
"""
给定一个由四个点(x, y)坐标组成的列表,请编写一个函数,判断这四个点是否能组成正方形。
示例:
输入:[(1,1), (3,3), (1,3), (3,1)],输出:True。
输入:·[(0, 0), (0,2), (2,0), (2,1)],输出:False。
:return:
"""
# 尝试一:正方形的四边长度相等,“上底+下底”=“左边+右边”之和。即当所有x轴之和和y轴之和相等,即可以组成正方形。
# 结果一:解题思路有误,未考虑到菱形、且x1+x2==y1+y2相等的场景会有巧合,不代表就是4边相等
# sum_x = 0
# sum_y = 0
# for x, y in input_l:
# sum_x += x
# sum_y += y
# return sum_x == sum_y
#
# 尝试二:正方形的对角线相等。利用辅助线可得到规律:两点之间的x轴及y轴之差、与另两点之间的y轴及x轴之差的绝对值相等
# 如满足:abs(A(x)-B(x)) == (C(y)-D(y)) and abs(A(y)-B(y)) == abs(C(x)-D(x))
# 4个点的顺序不确定,所以遍历完所有点x、y组合的相减场景,只要有一个场景满足即可
# 结果二:目前的论证有效
A = input_l[0]
B = input_l[1]
C = input_l[2]
D = input_l[3]
if abs(A[0] - B[0]) == abs(C[1] - D[1]) and abs(A[1] - B[1]) == abs(C[0] - D[0]):
return True
elif abs(A[0] - C[0]) == abs(B[1] - D[1]) and abs(A[1] - C[1]) == abs(B[0] - D[0]):
return True
elif abs(A[0] - D[0]) == abs(B[1] - C[1]) and abs(A[1] - D[1]) == abs(B[0] - C[0]):
return True
elif abs(B[0] - C[0]) == abs(A[1] - D[1]) and abs(B[1] - C[1]) == abs(A[0] - D[0]):
return True
elif abs(C[0] - D[0]) == abs(A[1] - B[1]) and abs(C[1] - D[1]) == abs(A[0] - B[0]):
return True
# 以下场景与第2点重复
# elif abs(A[1] - C[1]) == abs(B[0] - D[0]) and abs(A[0] - C[0]) == abs(B[1] - D[1]):
# return True
else:
return False
assert is_square([(-1, 0), (0, 1), (1, 0), (0, -1)]) is True
assert is_square([(-1, 0), (0, 1), (2, 0), (0, -1)]) is False
assert is_square([(0, 0), (0, 2), (2, 0), (2, 2)]) is True
assert is_square([(1, 1), (3, 3), (1, 3), (3, 1)]) is True
assert is_square([(0, 0), (0, 2), (2, 0), (2, 1)]) is False
assert is_square([(1, 1), (4, 4), (7, 1), (4, -2)]) is True
# 以下为菱形的四个点坐标值,预期为False,否则校验方法有误
assert is_square([(0, 0), (2, 0), (1, -2), (-1, -2)]) is False