Dimmi, quante piazze ci sono?


12

Dato un array 2D non vuoto composto da 0e 1, trova il numero di quadrati i cui 4 angoli sono tutti 1. I quadrati non devono essere "retti". Tutte le file sono garantite per avere la stessa lunghezza.

Sono consentiti metodi di input / output ragionevoli.

Casi test:

0001000
1000000
0000000
0000100
0100000

Questo ritorna 1.

10101
00000
10100
00000
10001

Questo ritorna 2.

1111
1111
1111
1111

Questo ritorna 20.

Questo è . Vince la risposta più breve in byte. Si applicano scappatoie standard .


Un'altra interpretazione, se intendo l'intento: 4 1s su un quadrato, in modo tale che ciascuno 1sia equidistante lungo il perimetro dai suoi due vicini.
feersum,

@feersum Quest'ultima condizione è vera per ogni quadrato, non è vero?
Wojowu,

Risposte:


18

JavaScript (ES6), 127 124 119 byte

Salvato 3 byte grazie 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

Come?

Questa funzione scorre su tutte le coppie di celle (x, y) , (X, Y) della matrice di input m tale che:

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

Ogni coppia corrispondente descrive le coordinate di un potenziale bordo di un quadrato. Le disequazioni garantiscono che ogni fronte sia testato una sola volta.

Usiamo il vettore [dx, dy] = [X - x, Y - y] ruotato di 90 ° in senso orario per testare le celle situate in [x - dy, y + dx] e [X - dy, Y + dx] . Se entrambi contengono un 1 , abbiamo trovato un quadrato valido.

piazza

Casi test


-2 byte: g=(a,b)=>(m[b+X-x]||0)[a-Y+y]-1 byte: usa |ninvece di&&n
nderscore

6

MATL , 20 byte

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

L'input è una matrice.

Provalo online!

Come funziona

Questo trova tutte le coordinate delle voci diverse da zero nella griglia di input e le rappresenta come numeri complessi, in modo che gli indici di riga e colonna corrispondano rispettivamente a parti reali e immaginarie.

Il codice quindi genera un array di tutte le combinazioni (l'ordine non ha importanza) di questi numeri presi 4 alla volta. Ogni combinazione rappresenta un quadrato candidato. Per ogni combinazione, viene calcolata la matrice 4 × 4 delle differenze assolute in coppia (ovvero le distanze nel piano complesso). Questa è una matrice simmetrica con zeri lungo la sua diagonale principale. La combinazione corrente forma un quadrato se e solo se la matrice contiene esattamente 3 valori distinti (questi saranno il lato quadrato, la diagonale quadrata e lo zero):

inserisci qui la descrizione dell'immagine

D'altra parte, ad esempio, un rettangolo non quadrato darebbe origine a 4 valori distinti (due lati, un valore diagonale e zero);

inserisci qui la descrizione dell'immagine

e un quadrilatero generale può avere fino a 7 valori (quattro lati, due diagonali e zero):

inserisci qui la descrizione dell'immagine

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

Come funziona?
Leaky Nun,

@LeakyNun Spiegazione aggiunta
Luis Mendo,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.