Pertanyaan ini mirip dengan Biggest Square di kotak .
Tantangan
Diberikan matriks 1
dan 0
dalam format string "xxxx,xxxxx,xxxx,xx.."
atau format array ["xxxx","xxxx","xxxx",...]
, Anda akan membuat fungsi yang menentukan area submatrix persegi terbesar yang berisi semua 1
.
Submatrix kuadrat adalah salah satu dari lebar dan tinggi yang sama, dan fungsi Anda harus mengembalikan area submatrix terbesar yang hanya berisi 1
.
Sebagai contoh:
Diberikan "10100,10111,11111,10010"
, ini terlihat seperti matriks berikut:
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
Anda dapat melihat bolded 1
membuat submatrix kuadrat terbesar dengan ukuran 2x2, sehingga program Anda harus mengembalikan area yang 4.
Aturan
- Submatrix harus memiliki lebar dan tinggi yang sama
- Submatrix harus hanya berisi nilai
1
- Fungsi Anda harus mengembalikan area submatrix terbesar
- Jika tidak ada submatrix yang ditemukan, kembalikan
1
- Anda dapat menghitung area submatrix dengan menghitung jumlah
1
dalam submatrix
Uji kasus
Input: "10100,10111,11111,10010"
Keluaran: 4
Input: "0111,1111,1111,1111"
Keluaran: 9
Input "0111,1101,0111"
Output: 1
Ini adalah kode-golf , jadi jawaban tersingkat dalam byte menang.
Jawaban:
Jelly , 18 byte
+2 untuk menangani output hadir sublist no-all-1
Cobalah online! Atau lihat test-suite
Bagaimana?
sumber
Haskell ,
113 121 118117 byteCobalah online!
-3 byte terima kasih kepada Laikoni !
-1 byte terima kasih kepada Lynn !
+8 byte untuk persyaratan konyol mengembalikan 1 tanpa sub-matriks semua-1 ..
Penjelasan / Tidak Diundang
Fungsi pembantu berikut ini hanya membuat offset untuk
x
memungkinkan untuk mengurangi mereka dengans
:x#y
akany
mengeluarkan elemen dari daftar lalu mengambilx
:Fungsi
f
loop atas semua ukuran yang mungkin untuk sub-matriks secara berurutan, menghasilkan setiap sub-matriks dari ukuran yang sesuai, menguji apakah hanya berisi'1'
s dan menyimpan ukuran. Dengan demikian solusinya akan menjadi entri terakhir dalam daftar:sumber
Haskell ,
9997 bytePeriksa apakah input adalah matriks kuadrat dari orang-orang dengan
s==('1'<$s<$s)
, jika ya, jawabannya adalah panjang ^ 2, atau 0. Kemudian secara rekursif memotong pertama / kolom terakhir / baris dan mengambil nilai maksimum yang ditemukan di mana saja.Cobalah online!
sumber
K (ngn / k) ,
3328 byteCobalah online!
sumber
J ,
3327 byte-6 byte terima kasih kepada FrownyFrog!
Cobalah online!
Penjelasan:
Saya akan menggunakan test case pertama dalam penjelasan saya:
Saya menghasilkan semua kemungkinan pendatang persegi dengan ukuran dari 1 hingga jumlah baris input.
,~@#\
membuat daftar pasangan untuk ukuran submatrices dengan menjahit,.
togehter panjang awalan berurutan#\
input:Lalu saya menggunakannya untuk memotong
x u ;. _3 y
input menjadi submatrices. Saya sudah punyax
(daftar ukuran);y
adalah argumen yang tepat]
(input).Untuk setiap submatrix saya periksa apakah seluruhnya terdiri dari 1s:
(#**/)@,
- ratakan matriks, dan gandakan jumlah item dengan produk mereka. Jika semua item adalah 1d, hasilnya akan menjadi jumlah mereka, jika tidak - 0:Akhirnya saya meratakan daftar hasil untuk setiap submatrix dan menemukan maksimum:
>./@,
sumber
,~@#\
dan"1 2
->"$
"$
#
lebih pendek dari menjumlahkan 1s.APL (Dyalog Unicode) ,
353432 byteCobalah online!
SBCS Adám memiliki semua karakter dalam kode
Penjelasan akan datang akhirnya!
sumber
Retina , 143 byte
Cobalah online! Tautan termasuk kasus uji. Mengambil input sebagai string yang dipisahkan koma. Penjelasan:
Tambahkan a
,
untuk mengakhiri string terakhir, a;
untuk memisahkan string dari#
s dan a#
sebagai penghitung.Ulangi blok sampai tidak ada lagi subsitusi (karena setiap string sekarang hanya memiliki satu digit).
Rangkap tiga baris, atur penghitung ke 1 di baris pertama dan tambahkan di baris terakhir.
Di baris pertama, hapus digit pertama dari setiap string, sementara di baris kedua, hapus semua digit kecuali yang pertama.
Pada baris ketiga, bitwise dan dua digit pertama bersamaan.
Pada titik ini, setiap baris terdiri dari dua nilai, a) penghitung lebar horisontal dan b) bitwise dan dari itu banyak bit diambil dari setiap string. Konversikan sisa
1
s menjadi#
s sehingga dapat dibandingkan dengan penghitung.Temukan sembarang bit (vertikal) yang cocok dengan penghitung (horizontal), sesuai dengan kuadrat
1
s pada input asli, dan kuadratkan panjangnya.Sortir secara numerik.
Ambil yang terbesar.
Huruf nol matriks khusus.
sumber
JavaScript, 92 byte
Tampilkan cuplikan kode
sumber
APL (Dyalog Classic) ,
2120 byteCobalah online!
sumber
Python 2 ,
117109 byteKredit ke @etene untuk menunjukkan inefisiensi yang membuat saya byte tambahan.
Cobalah online!
Mengambil input sebagai string yang dipisahkan koma. Ini adalah pendekatan berbasis regex yang mencoba mencocokkan string input terhadap pola formulir
111.....111.....111
untuk semua ukuran yang mungkin dari kuadrat.Dalam perhitungan saya, melakukan ini dengan lambda anonim hanya sedikit lebih pendek dari fungsi yang ditentukan atau program lengkap. Bagian
or 1
pada akhirnya hanya diperlukan untuk menangani case edge yang aneh, di mana kita harus menampilkan1
jika tidak ada yang ada di input.sumber
Python 2 ,
116115117109 byteKredit ke @ Kirill untuk membantu saya golf lebih dan untuk solusi pintar & awal nya
Edit : Golf 1 byte dengan menggunakan lambda, saya tidak tahu menugaskannya ke variabel tidak dihitung terhadap jumlah byte.
Sunting 2 : Kirill menunjukkan solusi saya tidak berfungsi untuk kasus di mana input hanya berisi
1
s, saya harus memperbaikinya dan kehilangan dua byte berharga ...Edit 3 : lebih banyak bermain golf berkat Kirill
Mengambil string yang dipisahkan koma, mengembalikan integer.
Cobalah online!
Saya secara mandiri menemukan jawaban yang dekat dengan jawaban Kiril, yaitu berdasarkan regex, kecuali yang saya gunakan
re.search
dan a.def
Ini menggunakan regex yang dibangun selama setiap loop untuk mencocokkan kuadrat yang lebih besar secara bertahap dan mengembalikan yang terbesar, atau 1.
sumber
if
pendekatan sebagai "terlalu lama pasti", tetapi kemudian harus membuat beberapa cara lain untuk membuat nilai bool dari pertandingan. Sayangnya, solusi Anda kehilangan satu poin - Anda tidak bisa hanya memilikirange(l)
- itu akan kehilangan kasus ketika tidak ada nol sama sekali. Misalnya, ambil test case ke-2 dan jadikan semuanya 1 - ini harus menjadi 16, bukan 9.find
. Sekarang kode kita tidak identik lagi, saya sarankan kita setidaknya memperbaiki kesalahan yang jelas dari satu sama lain - dalam kasus Anda byte tambahan berasal dari menggunakan tuple,("1"*i,)
bukan daftar.find
juga, itu pintar kamu.Ruby
-n
, 63 byteCobalah online!
Versi Ruby dari jawaban Python saya . Golfier sebagai program lengkap. Atau, lambda anonim:
Ruby ,
7068 byteCobalah online!
sumber
Perl 6 ,
616058 byteCobalah online!
sumber
Python 2 ,
138128 byteCobalah online!
Diselamatkan
sumber
Clojure, 193 byte
Wow, segalanya meningkat: o
Kurang golf:
sumber