Latar Belakang
Saya ingin membeli sebidang tanah dan membangun rumah saya di atasnya. Rumah saya harus persegi panjang, dan sebesar mungkin; namun, plot yang tersedia memiliki banyak area berbatu yang tidak dapat saya bangun, dan saya mengalami kesulitan untuk memasang rumah potensial di plot tersebut. Saya ingin Anda menulis sebuah program yang menganalisis plot untuk saya.
Masukan dan keluaran
Input Anda adalah array 2D persegi panjang dari bit, dengan ukuran setidaknya 1 × 1, dalam format apa pun yang masuk akal. Array mewakili sebidang tanah; 1
s adalah area "baik" di mana saya bisa membangun rumah saya, dan 0
s "area berbatu" di mana rumah tidak bisa dibangun.
Output Anda akan menjadi area maksimal dari persegi panjang solid 1
s dalam array input. Itu mewakili area rumah terbesar yang bisa saya bangun di atas plot. Perhatikan bahwa jika tidak ada 1
input, maka outputnya adalah 0
.
Contoh
Pertimbangkan inputnya
101
011
111
S persegi terbesar adalah persegi panjang 1
2 × 2 di sudut kanan bawah. Ini berarti bahwa output yang benar adalah 4
.
Aturan dan penilaian
Anda dapat menulis program atau fungsi lengkap. Hitungan byte terendah menang, dan celah standar tidak diizinkan.
Uji kasus
0
-> 0
1
-> 1
00
00
-> 0
01
10
-> 1
01
11
-> 2
111
010
111
-> 3
101
011
111
-> 4
0111
1110
1100
-> 4
1111111
1110111
1011101
-> 7
111011000
110111100
001111110
011111111
001111110
000111100
000011000
-> 20
000110000
110110010
110111110
110011100
010011111
111111111
111101110
-> 12
plow
.Jawaban:
Jelly ,
21201817 byteCobalah online! atau verifikasi semua kasus uji .
Latar Belakang
Biarkan M menjadi matriks bit seperti
Kami mulai dengan menghitung jumlah 1 bit di setiap kolom M , mengatur ulang jumlah setiap kali kami menemukan 0 bit.
Sebagai contoh matriks kita, ini memberi
Selanjutnya, kami menghitung semua daftar yang berdekatan dari setiap baris. Kami mencapai ini dengan menghasilkan semua irisan panjang k , di mana k bervariasi antara 1 dan jumlah entri di setiap baris.
Untuk baris kedua dari belakang, ini memberi
Selanjutnya, kami memetakan setiap potongan ke produk minimum dan panjangnya. Untuk setiap irisan, ini menghitung luas persegi panjang dari 1 bit dari ketinggian maksimum yang memiliki irisan yang diberikan sebagai baris bawah.
Untuk irisan panjang 3 dari baris kedua dari belakang dari contoh matriks kita, ini memberi
Yang tersisa untuk dilakukan adalah mengambil maksimum di semua irisan semua baris.
Sebagai contoh matriks kita, ini memberi 12 .
Bagaimana itu bekerja
sumber
MATL,
323127 byteIni menggunakan pendekatan berbasis konvolusi 2D yang brutal. Semua ukuran persegi panjang yang mungkin dibuat dan dipadukan dengan medan. Hasil maksimum dari semua konvolusi adalah area persegi panjang maksimal.
Ini adalah solusi yang sangat tidak efisien karena untuk menghemat byte, saya membuat kernel untuk semua persegi panjang di antaranya
[1, 1]
dan[numel(input) numel(input)]
bukannya benar-benar menentukan jumlah baris / kolom dalam input untuk menentukan rentang dimensi persegi panjang yang tepat.Terima kasih kepada @Luis karena menyarankan penggunaan
M
dan menghilangkan]]
.Cobalah secara Online!
Penjelasan
sumber
Julia,
83605753 byteCobalah online!Kasing uji terakhir melebihi batas waktu TIO, tetapi saya telah memverifikasi secara lokal.
Bagaimana itu bekerja
Pertama ,! memeriksa apakah argumen matriksnya M seluruhnya terdiri dari 1 's.
Jika ya ,! mengembalikan jumlah entri M , yang sama dengan luasnya.
Jika tidak ,! melakukan hal berikut:
Putar M dengan 0 ° , 90 ° , 180 ° dan 270 ° searah jarum jam.
Hapus baris pertama dari masing-masing empat rotasi, efektif menghilangkan salah satu dari baris, baris bawah, kolom paling kiri dan kolom paling kanan dari M .
Sebut sendiri secara rekursif pada setiap submatrices.
Kembalikan nilai pengembalian maksimum dari panggilan rekursif.
sumber
JavaScript (ES6), 97 byte
Ternyata sedikit twiddling masih menang. Menerima array array integer. Tidak Disatukan:
Array diiris oleh baris sesuai jawaban lainnya, sehingga setiap rentang baris yang mungkin dilingkarkan. Diberikan berbagai baris, langkah selanjutnya adalah mengukur persegi panjang yang tersedia. Ini dicapai dengan ANDing baris bersama-sama sedikit demi sedikit; hasilnya adalah daftar bit yang ditetapkan di seluruh jajaran baris. Kemudian tetap menemukan panjang maksimal bit yang ditetapkan di baris dan kalikan dengan tinggi rentang. Tes dicuri tanpa malu-malu dari @ ed65:
sumber
Python 2.7,
9391898179 byteInput adalah daftar tupel. Verifikasi kasing yang lebih kecil di sini dan kasing yang lebih besar di sini .
Tanpa memoisasi, dua uji kasus terakhir melebihi batas waktu Ideone, karena mereka memerlukan, resp., 1.530.831.935 dan 2.848.806.121 panggilan ke f , yang membutuhkan 39 dan 72 menit pada mesin saya.
Algoritma
Untuk matriks M yang diberikan , ide umum adalah untuk mengulangi semua submatrices M dengan menghapus baris atas dan memutar seperempat putaran berlawanan arah jarum jam, melacak ukuran submatrians yang ditemui yang seluruhnya terdiri dari 1 bit.
Bermain golf implementasi rekursif langsung dari ide di atas mengarah ke fungsi f (M) yang melakukan hal berikut.
Jika M tidak mengandung 0 bit, kembalikan jumlahnya 1 bit.
Jika kita sudah memutar M dua kali dan tidak mengandung 1 bit, kembalikan 0 .
Jika kita sudah memutar M lima kali, kembalikan 0 .
Secara rekursif panggil f pada M tanpa baris atasnya.
Secara rekursif panggilan f pada M diputar seperempat putaran berlawanan arah jarum jam.
Kembalikan nilai pengembalian maksimum dari panggilan rekursif.
Kode
Dalam implementasi, kami menggunakan argumen fungsi tambahan t yang default ke 1 untuk melacak berapa kali kami telah memutar matriks khusus ini. Ini memungkinkan langkah kondensasi 1 ke 3 menjadi satu langkah dengan menguji
`t/3`in`M`
dan mengembalikan`M`.count(`t`)
jika tes gagal.Jika t = 1 , kami belum memutar submatrix khusus ini sebelumnya di cabang ini.
t / 3 = 0 , jadi
`t/3`in`M`
akan mengembalikan True jika representasi string M berisi karakter 0 .Jika tidak, kita kembali
`M`.count(`t`)
, berapa kali karakter 1 muncul dalam representasi string M .Perhatikan bahwa matriks tanpa 0 bit hanya dapat terjadi jika t = 1 , karena kita tidak berulang dalam kasus ini.
Jika 3 ≤ t ≤ 5 , kami sebelumnya telah memutar submatrix khusus ini setidaknya dua kali di cabang ini.
t / 3 = 1 , jadi
`t/3`in`M`
akan mengembalikan True jika representasi string M berisi karakter 1 .Jika tidak, kita kembali 0 dihitung sebagai
`M`.count(`t`)
, jumlah kali string representasi dari t (yaitu, karakter 3 , 4 atau 5 ) muncul di representasi string M .Jika t = 6 , kami sebelumnya telah memutar submatrix khusus ini lima kali di cabang ini.
t / 3 = 2 , jadi
`t/3`in`M`
akan mengembalikan False , karena representasi string M tidak mengandung karakter 2 .Kami kembali 0 dihitung sebagai
`M`.count(`t`)
, berapa kali karakter 6 muncul dalam representasi string M .Jika f belum kembali, langkah selanjutnya dijalankan.
f(M[1:])
memanggil f pada M tanpa baris atasnya. Karena t tidak ditentukan, defaultnya adalah 1 , menandakan bahwa ini adalah pertama kalinya f menjumpai submatrix khusus ini di cabang ini.f(zip(*M)[::-1],t+1)
panggilan f pada M diputar seperempat putaran berlawanan arah jarum jam, menambah t untuk melacak waktu kita memutar submatrix khusus ini di cabang ini.Kuartal gilirannya diperoleh dengan zipping deretan M dengan satu sama lain, kembali tupel dari unsur-unsur yang sesuai dari M baris 's, dengan demikian transposing M , kemudian membalikkan urutan baris (yaitu, menempatkan baris atas di bagian bawah dan sebaliknya ).
Akhirnya
max
mengembalikan nilai pengembalian maksimum dari panggilan rekursif.sumber
zip
mengembalikan daftar tupel elemen yang sesuai dari argumennya. Dengan daftar 2D (matriks) yang tidak dibungkus*M
, ia pada dasarnya mentransposisi baris dan kolom, jadizip(*M[::-1])
lakukan rotasi 90 ° searah jarum jam.JavaScript (ES6), 154
176Sunting mencoba mempersingkat sedikit, tetapi tidak dapat bersaing dengan solusi @ Neil
Coba setiap kotak yang mungkin, kembalikan ukuran maksimal. Mungkin algoritma yang sama dari jawaban Matl, hanya 6 kali lebih lama.
Input sebagai array bilangan bulat 2d
Kurang golf
Ini adalah algoritma asli, versi golf menyalahgunakan banyak fungsi array traversing untuk loop
Uji
sumber
APL (Dyalog Extended) ,
272320 byte-3 byte oleh Adám dan ngn
Cobalah online!
sumber
{⌈/,(×/×1∊⍵⍷⍨⍴∘1)¨⍳⍴⍵}
lebih pendek dan sederhana (bahkan tidak perlu Diperpanjang).{⌈/∊(×/×⍵⍷⍨⍴∘1)¨⍳⍴⍵}
Brachylog ,
201715 byteTerima kasih kepada Kroppeb untuk 2 byte
Cobalah online!
Penjelasan
sumber
aa
dapat diganti dengans
Coba online!R ,
129122 byteCobalah online!
Pendekatan brute force sederhana dan sederhana.
Kode dan penjelasan yang belum dibuka:
sumber
Stax , 14 byte
Jalankan dan debug itu
sumber
Matlab 106 byte
Tidak Disatukan:
Operasi dalam loop dimulai dengan konvolusi 2D
conv2()
array input denganp*m
array yang.==p*m
memeriksa apakah array yang dihasilkan mengandung elemen yang sama denganp*m
. Elemen yang sesuai diaktifkan1
, semua elemen lainnya diaktifkan0
.any()
mengubah array menjadi vektor. Kolom yang berisi setidaknya satu entri bukan nol dihidupkan1
, jika tidak0
.p*m*()
mengalikan vektor denganp*m
mengubah semua1
-s menjadip*m
.[__,r]
kurung kotak menggabungkan hasil yang diperoleh dengan area maksimum sebelumnya disimpan dir
. Akhirnya,max()
temukan nilai maksimum dalam vektor yang dihasilkan.sumber
any()
kembali1
jika kolom berisi elemen bukan nol dan0
sebaliknya.Matlab
(222)(209)Sebenarnya, solusi ini membuat saya malu karena menjadi dua kali lipat solusi yang sama-bahasa yang sebenarnya tapi ... astaga, saya telah memikirkannya selama 6 jam! dan triknya sedikit berbeda dengan jawaban Dennis dan Neil.
Fungsi ini disebut sebagai
Saya bisa menghemat lebih banyak byte jika memperkenalkan panjang matriks dalam dimensi fungsi, meskipun, lebih banyak golf sedang berlangsung.
Bagaimana prosesnya?
Algoritma ini menambahkan matriks aktual ke dirinya sendiri bergeser dari itu ke arah kiri, dengan sedikit memutar-mutar (&). dalam setiap tahap, matriks yang dihasilkan ditetapkan sebagai awal dan ditambahkan ke dirinya sendiri bergeser ke atas berulang kali, lalu reload dari awal dengan matriks baru. Semua sub-elemen dari semua matriks yang dihasilkan oleh operasi
(original_matrix+shifted_matrix)&shifted_and_original_matrices)
ini dimaksimalkan ke output.contoh:
sumber
Japt , 30 byte
Coba semua uji kasus
Sekitar satu port jawaban Dennis's Jelly. Kasus uji hanyalah array angka 2D, yang dikonversi dari format pertanyaan menggunakan ini .
Penjelasan:
sumber
J , 38 byte
Cobalah online!
bagaimana
sumber