Dado un conjunto 2D no vacío que consiste en 0
y 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 código de golf . La respuesta más corta en bytes gana. Se aplican lagunas estándar .
1
s en un cuadrado, de modo que cada uno1
sea equidistante a lo largo del perímetro de sus dos vecinos.Respuestas:
JavaScript (ES6),
127124119 bytesGuardado 3 bytes gracias a nderscore
¿Cómo?
Esta función itera en todos los pares de celdas (x, y) , (X, Y) de la matriz de entrada m tal que:
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.
Casos de prueba
Mostrar fragmento de código
fuente
g=(a,b)=>(m[b+X-x]||0)[a-Y+y]
-1 byte: use en|n
lugar de&&n
MATL , 20 bytes
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):
Por otro lado, por ejemplo, un rectángulo no cuadrado daría lugar a 4 valores distintos (dos lados, un valor diagonal y cero);
y un cuadrilátero general puede tener hasta 7 valores (cuatro lados, dos diagonales y cero):
fuente