Memasukkan
Papan: Wadah 2D (matriks, daftar daftar, dll.) Dari huruf-huruf seperti:
["B", "C", "C", "C", "C", "B", "B", "C", "A", "A"],
["B", "A", "C", "B", "B", "A", "B", "B", "A", "A"],
["B", "C", "B", "C", "A", "A", "A", "B", "C", "B"],
["B", "B", "B", "A", "C", "B", "A", "C", "B", "A"],
["A", "A", "A", "C", "A", "C", "C", "B", "A", "C"],
["A", "B", "B", "A", "A", "C", "B", "C", "C", "C"],
["C", "B", "A", "A", "C", "B", "B", "C", "A", "A"]
Jika Anda memilih daftar daftar, Anda dapat mengasumsikan bahwa semua daftar panjangnya sama.
Aturan
- Untuk membuat persegi panjang yang valid, Anda membutuhkan semua sudut persegi panjang dengan 'huruf' yang sama.
- Contoh, lihat papan sampel dengan X di bawah. Anda dapat melihat 'X' pada (1,0) juga pada (4,0) juga pada (1,3) dan pada (4,3) maka Anda memiliki kotak [1,0,4,3] yang artinya dari (1,0) hingga (4,3):
Papan sampel dengan X :
["B", "X", "C", "C", "X", "B", "B", "C", "A", "A"],
["B", "A", "C", "B", "B", "A", "B", "B", "A", "A"],
["B", "C", "B", "C", "A", "A", "A", "B", "C", "B"],
["B", "X", "B", "A", "X", "B", "A", "C", "B", "A"],
["A", "A", "A", "C", "A", "C", "C", "B", "A", "C"],
["A", "B", "B", "A", "A", "C", "B", "C", "C", "C"],
["C", "B", "A", "A", "C", "B", "B", "C", "A", "A"]
- Tujuannya adalah untuk menemukan persegi panjang atau salah satu dari persegi panjang dengan area terbesar, dihitung dengan (kanan-kiri + 1) * (bawah-atas + 1)
- Jika ada beberapa persegi panjang dengan area maksimum yang sama, hasilkan salah satunya. Secara opsional, yang dengan (koordinat atas, koordinat kiri, koordinat kanan, koordinat bawah) terkecil secara leksikografis.
- Persegi panjang harus memiliki tepi yang sejajar dengan tepi papan.
- Setiap huruf adalah karakter ASCII yang dapat dicetak dari A hingga Z (keduanya termasuk).
Keluaran
Outputnya harus berupa posisi kiri-atas dan kanan-bawah dari sudut persegi panjang area terbesar. Untuk sampel "papan" pertama, kotak besar adalah kotak kuning:
Dan jawabannya harus:
[1, 1, 8, 4]
Contoh kasus uji kedua
Masukan dari:
["C", "D", "D", "D", "A", "A"],
["B", "D", "C", "D", "A", "A"],
["B", "D", "D", "C", "A", "C"],
["B", "D", "B", "C", "A", "C"]
Harus menghasilkan satu dari tiga daftar koordinat ini yang mengidentifikasi area enam persegi panjang:
[1, 0, 2, 2]
[1, 0, 3, 1]
[3, 2, 5, 3]
Pertanyaan ini diposting di Stack Overflow dengan judul: Bagaimana menemukan persegi panjang terbesar dalam array 2D yang dibentuk oleh empat sudut yang identik? dan dengan solusi JS kasar ini (saya dapat mengatakan "kasar" karena kode saya;):
Ok, ini posting pertama saya, tolong toleransi dengan saya. Saya akan mengubah semua yang Anda katakan untuk meningkatkan kuis.
((left,top),(right,bottom))
harus baik-baik saja. Saya menghapus jawaban dan jawaban saya lagi ketika pertanyaan benar-benar disempurnakan.Jawaban:
Python 2 ,
148130 byteCobalah online!
sumber
Retina ,
163162 byteCobalah online! Sunting: Disimpan 1 byte karena trailing yang
)
cocok dengan$.(
itu implisit. Penjelasan:Ekspresi reguler ini cocok dengan persegi panjang. Kelompoknya adalah sebagai berikut: 1) Baris atas (sebagai jumlah tangkapan) 2) Kolom kiri (panjang) 3) Penyeimbangan untuk memastikan sudut kiri sejajar 4) Huruf untuk sudut 5) Lebar + 1 (panjang) 6) Penyeimbang untuk memastikan sudut kanan sejajar 7) Kolom kanan (panjang) 8) tidak digunakan 9) Tinggi (sebagai jumlah tangkapan). The
w
Memastikan opsi yang semua lebar kemungkinan persegi panjang yang cocok untuk masing-masing atas diberikan sudut kiri. The$
pilihan daftar hasil menggunakan pola substitusi berikut.Substitusi adalah sebagai berikut: Kolom kanan, baris atas, kolom kiri, negasi luas persegi panjang (secara harfiah dihitung sebagai panjang pengulangan string lebar sebanyak satu kali lebih tinggi daripada jumlah kali), kolom kiri , baris atas, kolom kanan, diikuti oleh ekspresi yang mengevaluasi ke baris bawah (tangkapan akan menelan biaya 12 byte plus saya sudah kehabisan variabel satu digit). Empat tangkapan pertama mewakili urutan pengurutan berdasarkan prioritas. Saat Retina mengurutkan secara stabil, pengurutan multikolom dapat dibuat dengan mengurutkan berdasarkan setiap kolom pengurutan dari paling tidak ke prioritas terbesar. (Area harus disortir dalam urutan menurun, sehingga jenis string tunggal tidak dapat digunakan.)
Empat jenis numerik kemudian dilakukan.
Kolom sortir kemudian dihapus setelah setiap sortir.
Karenanya entri pertama adalah sekarang hasil yang diinginkan.
Catatan: Pembatasan pada pilihan persegi panjang dari suatu daerah sejak itu telah rileks dan versi
144-byte144berikut ini lebih memilih yang lebih luas daripada persegi panjang yang lebih tinggi:Cobalah online!
sumber
Jelly , (27?)
2928 byte27 jika pengindeksan berbasis 1 diizinkan - hapus jejak
’
Program lengkap.
Cobalah online! (atau lihat test case lainnya )
Bagaimana?
sumber
Perl 6 ,
8373 byteCobalah online!
Mengembalikan daftar daftar
((x0 y0) (x1 y1))
.Penjelasan
sumber
Haskell , 144 byte
Cobalah online!
sumber
b<=d
, selama Anda menyimpannyaa<=c
.Jelly , 24 byte
Cobalah online!
⁺
terbukti bermanfaat.Format output: [atas, bawah], [kiri, kanan] . Pengindeksan 1.
sumber
JavaScript (ES6), 121 byte
-1 byte terima kasih kepada @ l4m2
-1 byte terima kasih kepada @tsh
+2 byte untuk mematuhi aturan penilaian persegi panjang baru
Mengambil input sebagai matriks string. Mengembalikan koordinat terindeks 0: [x0, y0, x1, y1] .
Cobalah online!
sumber
a=>a.map(b=(r,y)=>r.map((v,x)=>a.map((R,Y)=>R.map((V,X)=>V+R[x]+r[X]!=v+v+v|(A=(X-x)*(Y-y))<=b||(o=[x,y,X,Y],b=A)))))&&o
(A=...)<=b
->(A=...)<b
?APL (Dyalog Classic) , 38 byte
Cobalah online!
sumber
Java 8,
208205 bytePasti bisa bermain golf .. Sekarang saya menggunakan pendekatan yang paling jelas menggunakan
empattiga bersarang untuk-loop.-3 byte berkat @ceilingcat yang menggabungkan loop bagian dalam baris dan kolom menjadi satu loop.
Penjelasan:
Cobalah online.
sumber