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)删除重复项,然后测试长度
- 获取点的每个组合(p中的a,b代表c,d中的d)
- 获取每个点到每个其他点的距离列表
- 使用设置检查只有三个唯一的距离-零(与自身相比的点)-边长-对角线长度
要保存代码字符,我是:
- 使用1个char函数名称
- 使用1行函数定义
- 不用检查唯一点的数量是4,而是检查不同点的长度是-1(节省== 3 ==)
- 使用列表和元组解包获得p中的a,b以获得p中的c,d,而不是使用a [0],a [1]
- 使用pow(x,.5)而不是包括数学来获取sqrt(x)
- 不在)后放置空格
- 不要将浮动的前导零
我担心有人会找到打破这一点的测试案例。因此,请这样做,不适。例如,我只检查三个距离而不是进行abs()并检查边长和斜边的事实,似乎是一个错误。
第一次我尝试编码高尔夫。如果我违反任何家庭规矩,请保持友善。