Diberikan array 2D non-kosong yang terdiri dari 0
dan 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 kode-golf . Jawaban terpendek dalam byte menang. Celah standar berlaku.
1
s di atas bujur sangkar, sehingga masing-masing1
berjarak sama sepanjang dari kedua tetangganya.Jawaban:
JavaScript (ES6),
127124119 byteDisimpan 3 byte berkat nderscore
Bagaimana?
Fungsi ini berulang pada semua pasangan sel (x, y) , (X, Y) dari matriks input m sedemikian rupa sehingga:
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.
Uji kasus
Tampilkan cuplikan kode
sumber
g=(a,b)=>(m[b+X-x]||0)[a-Y+y]
-1 byte: gunakan|n
alih-alih&&n
MATL , 20 byte
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):
Di sisi lain, misalnya, persegi panjang non-persegi akan menimbulkan 4 nilai berbeda (dua sisi, satu nilai diagonal, dan nol);
dan segiempat umum dapat memiliki hingga 7 nilai (empat sisi, dua diagonal, dan nol):
sumber