Salah satu hiburan matematika favorit saya adalah menggambar kotak persegi panjang, kemudian menemukan semua persegi panjang yang terlihat di kotak itu. Di sini, ambil pertanyaan ini, dan usahakan sendiri!
Bisakah Anda menghitung jumlah persegi panjang?
+-----+-----+-----+-----+
| | | | |
| | | | |
+-----+-----+-----+-----+
| | | | |
| | | | |
+-----+-----+-----+-----+
| | | | |
| | | | |
+-----+-----+-----+-----+
| | | | |
| | | | |
+-----+-----+-----+-----+
Jumlah total persegi panjang untuk ini 4 x 4 papan minichess persis
100
Apakah Anda benar?
Matematika terkait: Berapa banyak persegi panjang yang ada pada kotak-kotak 8 × 8?
Tantangan
Tulis fungsi / program terpendek yang menghitung jumlah persegi panjang yang terlihat pada kisi / gambar non-toroidal .
Tantangan terkait: Hitung Persegi Panjang Unik! , Temukan jumlah persegi panjang dalam array byte 2D .
Masukkan format
Fungsi atau program Anda dapat memilih untuk bekerja dengan input berbasis teks atau input grafis.
Input berbasis teks
Kisi-kisi akan berupa kisi ASCII m -by- n ( m rows, n kolom) yang terdiri dari karakter berikut:
- ruang,
-
untuk bagian segmen garis horizontal,|
untuk bagian segmen garis vertikal, dan+
untuk sudut.
Anda dapat memperkenalkan kisi ASCII ini sebagai input / argumen ke program / fungsi Anda dalam bentuk
- string tunggal dibatasi oleh jeda baris,
- string tanpa baris baru tetapi dengan satu atau dua bilangan bulat yang mengkode dimensi grid, atau
- berbagai string.
Catatan: Input berbasis teks mengandung setidaknya 1 baris dan setidaknya 1 kolom.
Input Grafis
Atau, kisi-kisi dikodekan sebagai gambar PNG hitam-putih dengan lebar 5 * n piksel dan tinggi 5 * m piksel. Setiap gambar terdiri dari 5 px * 5 px blok yang sesuai dengan input ASCII dengan:
- Spasi dikonversi menjadi blok putih. Blok-blok ini disebut blok spasi .
- Segmen dan sudut garis dikonversi ke blok non- putih. Pixel tengah blok semacam itu berwarna hitam.
- Sunting: Jika dua sudut (dalam input ASCII) dihubungkan oleh segmen garis, pusat blok yang sesuai (dalam input grafis) juga harus dihubungkan oleh garis hitam.
Ini berarti bahwa setiap blok hanya dapat dipilih (Klik di sini untuk gambar yang lebih besar) .
Catatan: Batas biru hanya untuk tujuan ilustrasi. Input grafis minimal 5 px lebar dan 5 px tinggi. Anda dapat mengonversi input grafis ke gambar monokrom apa pun, yang berpotensi berupa format file gambar lainnya). Jika Anda memilih untuk mengonversi, sebutkan dalam jawabannya. Tidak ada penalti untuk konversi.
Format output
Jika Anda menulis sebuah program, program tersebut harus menampilkan angka non-negatif yang menunjukkan jumlah total persegi panjang dalam input.
Jika Anda menulis fungsi, itu juga harus mengembalikan angka non-negatif yang menunjukkan jumlah persegi panjang dalam input.
Contoh Kasus
Kasus 1, Grafik: ( 30 px * 30 px), ASCII: ( 6 baris, 6 cols)
+--+
| |
| ++-+
+-++ |
| |
+--+
Output yang diharapkan: 3
Kasus 2, Grafik: ( 20 px * 20 px), ASCII: ( 4 baris, 4 cols)
++-+
|+++
+++|
+-++
Output yang diharapkan: 6
Kasus 3, Grafik: ( 55 px * 40 px), ASCII: ( 8 baris, 11 cols)
+++--+
+-+++ |
| | ++--+
+--+--++ ++
| ||
| ||
++ +--++
++
Output yang diharapkan: 9
Kasus 4, Grafik: ( 120 px * 65 px), ASCII: ( 13 baris, 24 cols)
+--+--+ +--+ +--+ +--+
| | | | | | | | |
+--+--+ | | | | | |
| | | +--+--+--+--+--+
+--+--+ | | | |
| | | | ++
+-+-+-+-+ +--+ +--+ ++
| | | | |
+-+-+-+-+-+-+-+-+-+-+-+
| | | | | | | | | | | |
+-+-+-+-+-+-+-+-+-+-+-+
| | | | | | | | | | | |
+-+-+-+-+-+-+-+-+-+-+-+
Output yang diharapkan: 243
Kasus 5, Graphic: ( 5 px * 5 . Px Ya, itu adalah di sana!), ASCII: Hanya satu ruang.
Output yang diharapkan: 0
Kasus 6, Grafik: ( 35 px * 20 px), ASCII: ( 4 baris, 7 cols)
+--+--+
|++|++|
|++|++|
+--+--+
Output yang diharapkan: 5
Asumsi
Untuk membuat hidup lebih mudah, Anda dijamin bahwa:
- Dengan menjadi non-toroidal , kisi tidak membungkus secara horizontal atau vertikal.
- Tidak ada ujung yang longgar, misalnya
+---
atau+- -+
. Semua segmen garis memiliki dua ujung. - Dua garis yang bertemu
+
harus berpotongan satu sama lain pada saat itu. - Anda tidak perlu khawatir tentang input yang tidak valid.
Aturan terhadap celah standar berlaku. Harap perlakukan kotak sebagai persegi panjang. Secara opsional, Anda bisa menghapus spasi tambahan di setiap baris kisi.
Ini adalah kode-golf , jadi buat entri Anda sesingkat mungkin. Solusi berbasis teks dan grafis akan bersaing bersama.
Papan peringkat
sumber
Jawaban:
Grime ,
3128 byteCobalah online!
Mengambil input dalam format ASCII.
Penjelasan
Sintaksis Grime sangat dekat dengan ekspresi reguler. Setiap baris mendefinisikan pola yang mungkin cocok atau tidak cocok dengan persegi panjang karakter.
T
cocok dengan persegi panjang yang baris atas dan kolom kiri terlihat valid.Baris kedua adalah "program utama".
sumber
JavaScript (ES6),
176171 byteMengambil input sebagai array string dengan panjang yang sama. Penjelasan: Membuat serangkaian ekspresi reguler yang cocok dengan persegi panjang dari semua lebar dan tinggi yang mungkin (dan beberapa lebar dan tinggi yang tidak mungkin, tapi itulah kode golf untuk Anda) dan menghitung berapa banyak pertandingan yang mereka hasilkan. Karena ada grup penangkap di regexp,
split
pengembalian2n+1
untukn
pertandingan, jadi saya benar menggeser dengan 1 untuk mendapatkan jumlah pertandingan, karena itu menghemat satu byte lebih dari membuat grup tidak menangkap.sumber
J ,
1039586807670 byteCobalah online!
Mengambil input sebagai array string dengan spasi tambahan (sehingga setiap string memiliki ukuran yang sama). Menggunakan operator subarray penuh
;._3
untuk beralih di setiap ukuran subarray yang mungkin lebih besar dari 2 x 2, dan menghitung subarrays yang merupakan persegi panjang yang valid. Menyelesaikan semua test case hampir secara instan.sumber
Mathematica,
136134132 bytePenggunaan: (untuk versi 136-byte yang lama, tetapi versi yang baru pada dasarnya identik)
catatan:
@*
baru dalam versi 10. Dalam versi yang lebih lama, gunakanTr~Composition~Flatten
sebagai gantiTr@*Flatten
.sumber
"Tr@" cannot be followed by "*Flatten".
@*
(singkatan untukComposition
) adalah baru dalam versi 10.RectangleCount[]
?Jelly ,
60 53 52 5150 byteProgram lengkap yang menerima daftar string (baris dengan panjang yang sama) dan mencetak hitungan.
Cobalah online!
... atau untuk kemudahan copy & paste penggunaan input ini program penuh (dengan byte tambahan untuk garis split)
- perhatikan garis yang diperlukan untuk mengandung spasi tambahan untuk program untuk berfungsi dengan benar sekalipun.
Bagaimana?
sumber
Tergelincir ,
3229 byteCobalah online!
27 byte kode + 2 byte untuk
n
dano
flag. Mengambil input dalam format yang sama dengan yang disediakan dalam pertanyaan (yaitu blok baris yang dibatasi baris baru).sumber
Haskell,
180167166 byteCobalah online!
Pergi melalui semua posisi sudut yang mungkin dengan empat loop bersarang dan periksa apakah semua karakter pada garis di antara mereka terdiri dari
+-
(horizontal) atau+|
(vertikal).sumber
Jelly ,
41393433 byteCobalah online! atau Lihat semua case.
Berdasarkan jawaban saya di J.
Penjelasan
sumber