Kita semua telah melihat gambar-gambar dengan tulisan "Berapa banyak kotak dalam gambar ini? 98% tidak akan mendapatkan ini dengan benar!" Nah, inilah kesempatan Anda untuk menertawakan 98% itu.
Memasukkan
Blok persegi panjang yang hanya terdiri dari 2 karakter. Dalam bentuk umum, ini didefinisikan oleh m baris, masing-masing berisi n karakter.
Contoh:
0000xxx
00x00xx
00000xx
xxxxx0x
Ini dapat direpresentasikan sebagai string yang dipisahkan oleh baris baru, larik string, atau larik karakter 2D. Jenis input lain harus disarankan dalam komentar.
Keluaran
Output akan berupa bilangan bulat yang mewakili jumlah total kuadrat yang diwakili secara individual oleh kedua karakter (dalam pseudocode, num_squares (char1) + num_squares (char2))
Sebuah persegi didefinisikan sebagai satu set contoh dari karakter yang sama yang sepenuhnya menguraikan persegi geometris sisi panjang minimal 2 . Kotak ini tidak perlu diisi oleh karakter yang menguraikannya. Contoh-contoh berikut menggambarkan konsep ini:
x0
0x // no squares
xxx
x0x
xxx // 1 square of side length 3
0000
0xx0
0xx0
0000 // 1 square of side length 2, 1 square of side length 4
Mencetak gol
Program Anda akan dinilai oleh 2 kriteria, dengan urutan kepentingan:
- Jumlah karakter dalam blok kode Anda yang bukan bagian dari kotak, seperti yang didefinisikan di atas (Anda harus berusaha meminimalkan ini!) (Catatan: karakter di dalam kotak tidak secara otomatis dianggap sebagai bagian dari kotak itu) (Catatan 2: baris baru tidak diperhitungkan dalam skor ini)
- Jumlah byte (Anda harus berusaha meminimalkan ini!)
Kriteria kedua akan bertindak sebagai pemutus dasi untuk yang pertama.
Aturan Tantangan
- Demi fleksibilitas, Anda dapat memilih untuk menggunakan 2 karakter alfanumerik apa pun untuk mengganti 0 dan x dari contoh saya, selama mereka bukan karakter yang sama.
- Setiap baris dalam persegi panjang input harus memiliki panjang yang sama, dan tidak boleh mengandung karakter apa pun selain 2 yang ditentukan untuk jawaban Anda terhadap tantangan (selain karakter baris baru, jika berlaku)
- Kotak trivial (kotak 1x1 dilambangkan dengan satu karakter) tidak dihitung terhadap output. Mereka payah.
- Program Anda tidak harus menangani input kosong, tetapi harus menangani kasus di mana tidak ada kotak yang mungkin (ketika salah satu dimensi dari persegi panjang input adalah 1)
- Anda juga dapat memilih untuk menentukan bahwa Anda menangani kotak yang selaras secara diagonal jika Anda menikmati tantangan. Ini akan ditambahkan ke output yang ditentukan dalam spesifikasi tantangan.
Contoh konsep ini:
Input:
00x00
0x0x0
x000x
0x0x0
00x00
Output: 6 (1 diagonally aligned square of side length 3, 5 diagonally aligned squares of side length 2)
Uji Kasus
Berikut ini adalah beberapa kasus uji dasar yang harus cocok dengan program Anda. Nilai dalam tanda kurung adalah output yang harus Anda pilih untuk menghitung kuadrat selaras diagonal.
Input:
xxxx
x00x
x0xx
xxxx
Output: 2 (2)
Input:
x00000xxx0
Output: 0 (0)
Input:
xxx0x0x000xx0xx0
0x000x00x0x0xx00
00xx0xx00xx0000x
x0x0x0x0x00x0xxx
00xx0xxx00xxx0x0
Output: 0 (5)
Input:
0000
0000
0000
0000
0000
0000
Output: 26 (34)
Input:
xxx00
xx000
Output: 2 (2)
Aturan umum
- Aturan standar berlaku untuk jawaban Anda, jadi Anda diperbolehkan menggunakan STDIN / STDOUT, fungsi / metode dengan parameter yang tepat dan tipe pengembalian, program penuh. Panggilanmu.
- Celah default tidak diperbolehkan.
- Jika memungkinkan, silakan tambahkan tautan dengan tes untuk kode Anda.
- Menambahkan penjelasan untuk jawaban Anda sangat disarankan.
- Ada pertanyaan / koreksi / saran untuk saya? Komentar dibawah! Ini adalah pertanyaan pertama saya, jadi saya senang belajar sebanyak mungkin darinya.
sumber
Jawaban:
Perl, 0 karakter tidak dalam kotak (25430 byte)
Seperti yang Anda lihat, setiap karakter adalah bagian dari kotak. Setengah bagian atas dari setiap kotak besar dikomentari oleh komentar garis, dan bagian bawah (termasuk baris kedua yang tidak dikomentari) diloloskan oleh dokumen besar di sini yang dimulai di tengah-tengah kotak (
<<'';#
) dan berakhir di baris kosong setelah alun-alun besar.Program ini dihasilkan secara otomatis dari program berikut:
Yang merupakan program untuk memecahkan tantangan yang sama, tetapi (sangat ringan) golf untuk byte dan panjang garis pendek, bukan untuk skor.
Pertama-tama dibutuhkan input tinggi dan panjang persegi panjang, kemudian karakter individu dari persegi panjang dipisahkan oleh spasi. Contoh penggunaan: Untuk memecahkan persegi panjang
Anda memanggil program seperti ini:
perl theprogram.pl 3 5 x x x y y x x y y y x y y x x
Bagaimanapun, dengan mengkuadratkan kode seperti ini, harus mungkin untuk mendapatkan skor 0 atau 2 dengan bahasa pemrograman apa pun yang memiliki solusi satu baris dan karakter komentar garis, dengan mengubah one-liner
seperti ini:
Satu-satunya karakter yang bukan bagian dari kotak adalah dua spasi. Bergantung pada bahasanya, mungkin juga ada cara untuk menggunakan string multiline yang pintar atau komentar (seperti Perl di sini-docs) atau semacam kode redundan untuk membuat dua karakter spasi menjadi bujur sangkar.
Adapun mendapatkan byte rendah, solusi saya memiliki banyak perbaikan langsung, dan saya yakin ada juga banyak cara lain untuk memperbaiki teknik ini, tetapi saya tidak memiliki kesabaran untuk itu; Saya hanya ingin memberikan demonstrasi sehingga kalian bisa menjadi liar dengan itu.
sumber
MATL ,
18161410 karakter tidak dalam kuadrat (92103111127 byte)Input adalah matriks karakter dengan karakter
+
dan-
. Tidak menghitung kotak diagonal.Cobalah online!
Atau verifikasi semua contoh dan uji kasus .
sumber
Jelly ,
20 1917 19081905 byte , Skor200Program lengkap mengambil daftar daftar
.
dan+
karakter. (Bekerja untuk karakter apa pun, bahkan lebih dari 2).Cobalah online!
Setiap upaya untuk mengurangi skor dengan memperkenalkan karakter tampaknya hanya meningkatkan skor lebih banyak. Saya kira cara untuk memenangkan tantangan ini adalah untuk menemukan kanan lenguage !Tapi Jelly tidak memiliki karakter komentar, jadi diperlukan sedikit kreativitas tambahan ...
Program Jelly terdiri dari "Tautan" - kode yang dipisahkan oleh karakter baris baru, karakter pilcrow (
¶
- diartikan sebagai byte yang sama dengan baris baru) atau karakter halaman kode yang valid yang tidak memiliki perilaku yang ditentukan (saat iniq
adalah contoh). Yang terakhir sebenarnya dihitung sebagai Tautan masing-masing daripada pemisah murni. Eksekusi program dimulai di paling kanan bawah Tautan, "Tautan Utama" (di sini⁽⁽ĿĿ
).Ŀ
⁽⁽ĿĿ
⁽⁽Ŀ
⁽⁽ĿĿ
q
ẆZṡLƊ€ẎṖƇZU$ƬḢ€ẎEƲ€S
q
sumber
¶
ini benar-benar hanya proxy untuk baris baru. Program ini benar-benar terlihat seperti ini¶
s dapat diganti dengan 9q
s atau(
s atau apa pun (seperti yang saya katakan di uraian).q
seperti yang saya kira akan: /⁽⁽ĿĿ
dievaluasiq
byte yang tidak digunakan? Ini berfungsi dengan baiku
yang juga tidak digunakan. </s> nevermind