告诉我,那里有几个正方形?


12

给定一个由0和组成的非空2D数组1,求4个角均为all的正方形的数量1。正方形不必是“直立的”。所有行都保证具有相同的长度。

允许使用合理的输入/输出方法。

测试用例:

0001000
1000000
0000000
0000100
0100000

这返回1

10101
00000
10100
00000
10001

这返回2

1111
1111
1111
1111

这返回20

这是。以字节为单位的最短答案将获胜。有标准漏洞


如果我理解此意图,则可以使用另一种解释:1在一个正方形上4 s,这样每个像素1沿其周长与两个邻居的距离相等。
feersum

@feersum后一个条件对于每个正方形都是正确的,不是吗?
Wojowu

Answers:


18

的JavaScript(ES6),127个 124 119字节

多亏了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)上进行迭代,使得:

  • m [x,y] = m [X,Y] = 1
  • x <X
  • y≤Y

每个匹配对描述一个正方形的潜在边的坐标。不等式保证每个边缘仅测试一次。

我们使用矢量[dx,dy] = [X-x,Y-y]顺时针旋转90°来测试位于[x-dy,y + dx][X-dy,Y + dx]的单元格。如果它们都包含1,那么我们已经找到一个有效的正方形。

广场

测试用例


-2个字节:g=(a,b)=>(m[b+X-x]||0)[a-Y+y]-1个字节:使用|n代替&&n
nderscore,

6

MATL,20字节

&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)

它是如何工作的?
Leaky Nun

@LeakyNun添加了解释
路易斯·门多
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.