Answers:
多亏了nderscore,节省了3个字节
m=>(F=(x,y)=>m.map((r,Y)=>r.map((i,X)=>i?1/y?n+=x<X&y<=Y&(g=(a,b)=>(m[b+X-x]||0)[a-Y+y])(x,y)&g(X,Y):F(X,Y):0)))(n=0)|n
此函数在输入矩阵m的所有单元对(x,y),(X,Y)上进行迭代,使得:
每个匹配对描述一个正方形的潜在边的坐标。不等式保证每个边缘仅测试一次。
我们使用矢量[dx,dy] = [X-x,Y-y]顺时针旋转90°来测试位于[x-dy,y + dx]和[X-dy,Y + dx]的单元格。如果它们都包含1,那么我们已经找到一个有效的正方形。
g=(a,b)=>(m[b+X-x]||0)[a-Y+y]
-1个字节:使用|n
代替&&n
&fJ*+4XN!"@&-|un3=vs
输入是一个矩阵。
这将找到输入网格中非零条目的所有坐标,并将它们表示为复数,以便行和列索引分别对应于实部和虚部。
然后,代码会生成一个数组,这些数组一次包含4个数字的所有组合(顺序无关紧要)。每个组合代表一个候选正方形。对于每个组合,计算成对的绝对差(即复平面中的距离)的4×4矩阵。这是一个对称矩阵,其主对角线为零。当且仅当矩阵包含正好包含3个不同的值(这些值将是正方形边,正方形对角线和零)时,当前组合才形成正方形:
另一方面,例如,非正方形矩形将产生4个不同的值(两侧,一个对角线值和零);
一个普通的四边形最多可以有7个值(四个边,两个对角线和零):
&f % Input (implicit). Push vectors of row and column indices of nonzero entries
J* % Multiply by imaginary unit
+ % Add the two vectors. Gives a vector of complex coordinates
4XN % Matrix of combinations of these complex numbers, taken 4 at a time. Each
% row is a combination
! % Transpose
" % For each column
@ % Push current column: candidate set of four points
&- % All pair-wise differences
| % Absolute value
u % Unique entries
n3= % Does the number of elements equal 3? Gives true (1) or false (0)
vs % Concatenate vertically with previous accumulated result, and sum
% End (implicit). Display (implicit)
1
在一个正方形上4 s,这样每个像素1
沿其周长与两个邻居的距离相等。