Katakan padaku, ada berapa kotak?

12

Diberikan array 2D non-kosong yang terdiri dari 0dan 1, temukan jumlah kotak yang memiliki 4 sudut 1. Kotak tidak harus "tegak". Semua baris dijamin memiliki panjang yang sama.

Metode input / output yang masuk akal diizinkan.

Testcases:

0001000
1000000
0000000
0000100
0100000

Ini kembali 1.

10101
00000
10100
00000
10001

Ini kembali 2.

1111
1111
1111
1111

Ini kembali 20.

Ini adalah . Jawaban terpendek dalam byte menang. Celah standar berlaku.

Biarawati Bocor
sumber
Interpretasi lain, jika saya memahami maksudnya: 4 1s di atas bujur sangkar, sehingga masing-masing 1berjarak sama sepanjang dari kedua tetangganya.
feersum
@feersum Kondisi terakhir berlaku untuk setiap kotak, bukan?
Wojowu

Jawaban:

18

JavaScript (ES6), 127 124 119 byte

Disimpan 3 byte berkat 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

Bagaimana?

Fungsi ini berulang pada semua pasangan sel (x, y) , (X, Y) dari matriks input m sedemikian rupa sehingga:

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

Setiap pasangan yang cocok menggambarkan koordinat tepi potensial kotak. Ketidaksamaan menjamin bahwa setiap sisi diuji hanya sekali.

Kami menggunakan vektor [dx, dy] = [X - x, Y - y] diputar 90 ° searah jarum jam untuk menguji sel-sel yang terletak di [x-dy, y + dx] dan [X-dy, Y + dx] . Jika keduanya mengandung 1 , kami telah menemukan kotak yang valid.

kotak

Uji kasus

Arnauld
sumber
-2 byte: g=(a,b)=>(m[b+X-x]||0)[a-Y+y]-1 byte: gunakan |nalih-alih&&n
nderscore
6

MATL , 20 byte

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

Input adalah sebuah matriks.

Cobalah online!

Bagaimana itu bekerja

Ini menemukan semua koordinat entri bukan nol dalam kisi masukan, dan menyatakannya sebagai bilangan kompleks, sehingga indeks baris dan kolom masing-masing sesuai dengan bagian nyata dan imajiner.

Kode kemudian menghasilkan array dari semua kombinasi (urutan tidak masalah) dari angka-angka ini yang diambil 4 sekaligus. Setiap kombinasi mewakili kuadrat kandidat. Untuk setiap kombinasi, matriks 4 × 4 dari perbedaan absolut berpasangan (yaitu jarak dalam bidang kompleks) dihitung. Ini adalah matriks simetris dengan nol sepanjang diagonal utamanya. Kombinasi saat ini membentuk kuadrat jika dan hanya jika matriks berisi tepat 3 nilai berbeda (ini akan menjadi sisi kuadrat, kuadrat diagonal, dan nol):

masukkan deskripsi gambar di sini

Di sisi lain, misalnya, persegi panjang non-persegi akan menimbulkan 4 nilai berbeda (dua sisi, satu nilai diagonal, dan nol);

masukkan deskripsi gambar di sini

dan segiempat umum dapat memiliki hingga 7 nilai (empat sisi, dua diagonal, dan nol):

masukkan deskripsi gambar di sini

&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
sumber
Bagaimana cara kerjanya?
Leaky Nun
@LeakyNun Penjelasan ditambahkan
Luis Mendo