Diga-me, quantos quadrados existem?

12

Dada uma matriz 2D não vazia que consiste em 0e 1, encontre o número de quadrados cujos quatro cantos são todos 1. Os quadrados não precisam estar "na vertical". Todas as linhas são garantidas para ter o mesmo comprimento.

Métodos razoáveis ​​de entrada / saída são permitidos.

Casos de teste:

0001000
1000000
0000000
0000100
0100000

Isso retorna 1.

10101
00000
10100
00000
10001

Isso retorna 2.

1111
1111
1111
1111

Isso retorna 20.

Isso é . A resposta mais curta em bytes vence. Aplicam-se brechas padrão .

Freira Furada
fonte
Outra interpretação, se estou entendendo a intenção: 4 1s em um quadrado, de modo que cada um 1seja equidistante ao longo do perímetro de seus dois vizinhos.
feersum
@feersum A última condição é verdadeira para todos os quadrados, não é?
Wojowu 15/05

Respostas:

18

JavaScript (ES6), 127 124 119 bytes

Economizou 3 bytes graças 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

Quão?

Essa função itera em todos os pares de células (x, y) , (X, Y) da matriz de entrada m, de modo que:

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

Cada par correspondente descreve as coordenadas de uma aresta em potencial de um quadrado. As inequações garantem que cada borda seja testada apenas uma vez.

Usamos o vetor [dx, dy] = [X - x, Y - y] girado 90 ° no sentido horário para testar as células localizadas em [x - dy, y + dx] e [X - dy, Y + dx] . Se os dois contiverem 1 , encontramos um quadrado válido.

quadrado

Casos de teste

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

MATL , 20 bytes

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

Entrada é uma matriz.

Experimente online!

Como funciona

Isso localiza todas as coordenadas de entradas diferentes de zero na grade de entrada e as representa como números complexos, de modo que os índices de linha e coluna correspondam às partes reais e imaginárias, respectivamente.

O código gera uma matriz de todas as combinações (a ordem não importa) desses números, obtidos 4 de cada vez. Cada combinação representa um quadrado candidato. Para cada combinação, a matriz 4 × 4 de diferenças absolutas aos pares (ou seja, distâncias no plano complexo) é calculada. Esta é uma matriz simétrica com zeros ao longo de sua diagonal principal. A combinação atual forma um quadrado se e somente se a matriz contiver exatamente 3 valores distintos (estes serão o lado quadrado, a diagonal quadrada e zero):

insira a descrição da imagem aqui

Por outro lado, por exemplo, um retângulo não quadrado daria origem a 4 valores distintos (dois lados, um valor diagonal e zero);

insira a descrição da imagem aqui

e um quadrilátero geral pode ter até 7 valores (quatro lados, duas diagonais e zero):

insira a descrição da imagem aqui

&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
fonte
Como funciona?
Leaky Nun
@LeakyNun Explanation added
Luis Mendo