Dime cuántos cuadrados hay?

12

Dado un conjunto 2D no vacío que consiste en 0y 1, encuentre el número de cuadrados cuyas 4 esquinas son todas 1. Los cuadrados no necesitan estar "verticales". Se garantiza que todas las filas tienen la misma longitud.

Se permiten métodos de entrada / salida razonables.

Casos de prueba:

0001000
1000000
0000000
0000100
0100000

Esto vuelve 1.

10101
00000
10100
00000
10001

Esto vuelve 2.

1111
1111
1111
1111

Esto vuelve 20.

Este es el . La respuesta más corta en bytes gana. Se aplican lagunas estándar .

Monja permeable
fuente
Otra interpretación, si entiendo la intención: 4 1s en un cuadrado, de modo que cada uno 1sea ​​equidistante a lo largo del perímetro de sus dos vecinos.
Feersum
@feersum La última condición es verdadera para cada cuadrado, ¿no?
Wojowu

Respuestas:

18

JavaScript (ES6), 127 124 119 bytes

Guardado 3 bytes gracias a nderscore

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

¿Cómo?

Esta función itera en todos los pares de celdas (x, y) , (X, Y) de la matriz de entrada m tal que:

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

Cada par coincidente describe las coordenadas de un borde potencial de un cuadrado. Las inecuaciones garantizan que cada borde se pruebe solo una vez.

Utilizamos el vector [dx, dy] = [X - x, Y - y] girado 90 ° en sentido horario para probar las celdas ubicadas en [x - dy, y + dx] y [X - dy, Y + dx] . Si ambos contienen un 1 , hemos encontrado un cuadrado válido.

cuadrado

Casos de prueba

Arnauld
fuente
-2 bytes: g=(a,b)=>(m[b+X-x]||0)[a-Y+y]-1 byte: use en |nlugar de&&n
nderscore
6

MATL , 20 bytes

&fJ*+4XN!"@&-|un3=vs

La entrada es una matriz.

Pruébalo en línea!

Cómo funciona

Esto busca todas las coordenadas de entradas distintas de cero en la cuadrícula de entrada y las representa como números complejos, de modo que los índices de fila y columna corresponden a partes reales e imaginarias, respectivamente.

El código genera una matriz de todas las combinaciones (el orden no importa) de estos números tomados 4 a la vez. Cada combinación representa un cuadrado candidato. Para cada combinación, se calcula la matriz 4 × 4 de diferencias absolutas por pares (es decir, distancias en el plano complejo). Esta es una matriz simétrica con ceros a lo largo de su diagonal principal. La combinación actual forma un cuadrado si y solo si la matriz contiene exactamente 3 valores distintos (estos serán el lado cuadrado, la diagonal cuadrada y cero):

ingrese la descripción de la imagen aquí

Por otro lado, por ejemplo, un rectángulo no cuadrado daría lugar a 4 valores distintos (dos lados, un valor diagonal y cero);

ingrese la descripción de la imagen aquí

y un cuadrilátero general puede tener hasta 7 valores (cuatro lados, dos diagonales y cero):

ingrese la descripción de la imagen aquí

&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)
Luis Mendo
fuente
¿Como funciona?
Leaky Nun
@LeakyNun Explicación agregada
Luis Mendo