pengantar
Anda baru saja menerima tawaran pekerjaan di Perusahaan Perangkat Lunak Pretty Good. Anda cukup puas dengan ukuran kantor Anda, tetapi apakah Anda memiliki kantor terbesar ? Agak sulit untuk mengatakan dari hanya melihat kantor rekan kerja Anda ketika Anda mampir. Satu-satunya cara untuk mencari tahu ini adalah dengan memeriksa cetak biru untuk bangunan ...
Tugas Anda
Tulis program, skrip, atau fungsi yang membutuhkan denah lantai untuk bangunan Anda dan tunjukkan apakah kantor Anda yang terbesar. Denah mudah dibaca karena bangunan adalah n oleh n persegi.
Input akan terdiri dari n + 1 \n
-disvisi baris. Baris pertama akan memiliki nomor n di atasnya. N baris berikutnya akan menjadi denah bangunan. Contoh input sederhana:
6
......
. . .
.X . .
. . .
. . .
......
Aturan untuk denah adalah sebagai berikut:
.
(ASCII 46) Akan digunakan untuk mewakili dinding.(Spasi [ASCII 32]) akan digunakan untuk mewakili ruang terbuka.
- Anda diwakili oleh
X
(ASCII 88). Anda berada di kantor Anda. - Denah lantai akan menjadi n baris, masing-masing dengan n karakter.
- Bangunan ini benar-benar dikelilingi oleh dinding di semua sisi. Ini menyiratkan bahwa input baris ke-2 (baris pertama denah lantai) dan baris input terakhir adalah semua
.
s. Ini juga menyiratkan bahwa karakter pertama dan terakhir dari setiap garis denah akan menjadi.
s. - Ukuran kantor didefinisikan sebagai jumlah ruang yang berdekatan (berdekatan dengan bergerak dalam 4 arah, N, S, E, W, tanpa melalui dinding).
- Untuk keperluan ukuran kantor, X yang mewakili Anda dianggap sebagai
(ruang terbuka)
- 4 <= n <= 80
Anda harus memberi tahu apakah kantor Anda benar-benar lebih besar daripada semua kantor lainnya. Keluaran dapat berupa apa saja yang secara jelas menandakan Benar atau Salah dalam bahasa pemrograman pilihan Anda dan mematuhi konvensi standar nol, nol, dan kosong yang menandakan False. Benar menyiratkan kantor Anda benar-benar yang terbesar.
Contoh output untuk input di atas:
1
Karena kantor Anda 8 kaki persegi, dan satu-satunya kantor lainnya adalah 4 kaki persegi.
Pedoman I / O
- Input dapat dibaca dari stdin, dan jawab output ke stdout.
Atau
- Input mungkin berupa argumen string tunggal ke suatu fungsi, dan jawabannya adalah nilai balik dari fungsi itu.
Faq
- Seluruh bangunan terdiri dari dinding dan kantor.
- Bangunannya hanya satu lantai
- Ada yang dijamin sebagai X dalam input, tetapi tidak ada spasi. Anda dapat memiliki kantor 1x1 dan sisa bangunan adalah dinding (Anda memiliki kantor terbesar! Hore!).
Contoh lain
10
..........
. . . .
. . . .
. . . .
. .. . .
.. .
..........
. X .
. .
..........
Di sini ada 3 kantor, kantor selatan Anda berbentuk persegi panjang, kantor barat laut adalah segitiga (ish) dan kantor timur laut anehnya cacat, namun lebih besar dari milik Anda. Outputnya harus False.
Ini adalah tantangan untuk menulis kode terpendek, senang bermain golf kode !
sumber
X
diizinkan dalam input. :)Jawaban:
Ruby 2.0, 133 karakter
Kolaborasi dengan @Ventero. Selalu pertanda baik ketika mulai memecah stabilo sintaks!
Ini adalah solusi pengisian banjir rekursif. Membaca dari STDIN dan output ke STDOUT:
Lihat itu berjalan di Ideone .
sumber
f
sedikit:f=->l{a=[*l];a.product([~n,-1,1,n+1]){|p,d|a|=[p+d]if$_[p+d]<?.};a!=l ?f[a]:l.size}
. Dan koreksi saya jika saya salah, tetapi sepertinya tidak masalah jika baris pertama yang berisi panjangnya dibiarkan$_
, yang akan memungkinkan Anda untuk mempersingkat penguraian input kegets$e;n=$_.to_i
gets(p)
sepertip
tidak melakukan apa pun dan kembalinil
jika dipanggil tanpa argumen.product
mengembalikan receiver untuk menghilangkanl
sepenuhnya:f=->*a{a.product([~n,-1,1,n+1]){|p,d|a|=[p+d]if$_[p+d]<?.}!=a ?f[*a]:a.size}
- sayangnya kami tidak dapat mengganti lhs dan rhs!=
untuk menghilangkan spasi, karena jika tidak kedua belah pihak menunjuk ke larik yang tidak dimodifikasi.String#scan
danARGV
, menemukan kamar terbesar dapat dipersingkat sedikit:$_.scan(/ /){$*<<f[$
.ukuran]}; p $ *. Maks <f [~ / X /] `n
menjadif
sesuatu dengan[~n=$_.to_i,...]
, Anda kemudian dapat menggabungkan baris pertama dan ketiga menjadigets(p).scan(...
total 134 karakter.GolfScript (85 byte)
Demo online
Ini memiliki tiga bagian:
Transformasi input awal yang menghasilkan array 2D yang digunakan
0
untuk mewakili dinding,N
(jumlah total sel) untuk mewakili posisi awal saya, dan angka yang berbeda di antara mereka untuk setiap ruang terbuka lainnya.Isi banjir.
Penghitungan akhir. Ini menggunakan varian di ujung untuk elemen yang paling umum dalam sebuah array , menambahkan tie-breaker yang bias terhadapnya
N
.sumber
qN/(~_*:T:U;{[{i5%[0_U(:UT]
=}/]}%{{[{_2$*!!{[\]$W=_}*}*]}%z}T*:+0-:A{_T=A@-,2*+}$0=T=
.Javascript (E6) 155
292Versi dasar tidak digabungkan
Uji
Konsol Javascript di firefox
F('6\n......\n. . .\n.X . .\n. . .\n. . .\n......')
F('10\n..........\n. . . .\n. . . .\n. . . .\n. .. . .\n.. .\n..........\n. X .\n. .\n..........\n')
sumber
1
saya juga (di Firefox 30.0)C #,
444372 / (342 terima kasih HackerCow) byteSkor agak buruk dan terlambat ke pesta, tetapi tampaknya berhasil. Output 1 ketika Anda memiliki kantor tunggal terbesar, 0 ketika Anda tidak. Saya belum terlalu rumit dengan golf. Bekerja dengan membangun set terpisah dari input (loop pertama), menghitung ukuran setiap set (loop kedua) dan kemudian mencari untuk melihat apakah set saya adalah yang terbesar (loop ketiga).
Dua versi disediakan, satu adalah program yang dapat dikompilasi dan menerima input dari baris perintah, yang lain hanya fungsi yang mengharapkan string sebagai input dan mengembalikan int sebagai hasilnya (dan hanya salinan ulang dari yang pertama) - tidak perlu menggunakan klausa atau sejenisnya, harus bisa meletakkannya di mana saja dan itu akan berfungsi.
Program 372bytes :
Fungsi 342bytes :
Kurang bermain golf:
sumber
Main
fungsi dan mengganti fungsi dengan, katakanint f(string s)
Anda bisa menggunakans.Split('\n')[0]
alih-alihConsole.ReadLine()
dan mengembalikan1
atau0
. Ini akan menghemat banyak kodeCJam, 106 byte
Pendekatan berbeda untuk mengisi banjir. Meskipun, membuatnya lebih lama ...
Coba di sini
sumber
Python 2 - 258 byte
menggunakan stdin untuk input
Catatan: pertama
if
indentasi oleh spasi tunggal, baris indentasi lainnya menggunakan char tab tunggal atau tab dan spasi.sumber
J:
150121 byteSunting :
id
dancomp
sangat rumit dan lambat. Sekarang berfungsi menggeser peta 4 kali, alih-alih memindai dengan jendela 3x3 menggunakancut
(;.
).Dipertimbangkan sebagai cetak biru sebagai string. Dijelaskan di bawah ini:
sumber
Python 2 - 378 byte
Wow. Saya kehabisan latihan.
Ini adalah jawaban fungsi, tetapi mencemari namespace global. Jika ini tidak dapat diterima, dapat diperbaiki dengan biaya 1 byte:
Saya memiliki seluruh penjelasan panjang yang ditulis, tetapi ternyata itu tidak menyelamatkan dengan benar dan saya tidak melakukan itu lagi lmao
sumber