Kontes sederhana, terinspirasi oleh pertanyaan stackoverflow ini :
Anda diberi gambar permukaan yang difoto oleh satelit. Gambar tersebut adalah bitmap di mana air ditandai oleh '
.
' dan tanah ditandai oleh '*
'. Kelompok-kelompok yang berdekatan*
membentuk sebuah pulau. (Dua '*
' berbatasan jika mereka tetangga horisontal, vertikal atau diagonal). Tugas Anda adalah mencetak jumlah pulau dalam bitmap.
Satu *
juga dianggap sebagai pulau.
Input sampel:
.........**
**......***
...........
...*.......
*........*.
*.........*
Output sampel:
5
Pemenang adalah entri dengan jumlah byte terkecil dalam kode.
*
pulau satu-satunya*
juga pulau.Jawaban:
Mathematica
188 185 170 115 130 4648 karakterPenjelasan
Dalam versi sebelumnya, saya membuat grafik posisi yang memiliki jarak papan catur 1 dari satu sama lain.
GraphComponents
kemudian terungkap jumlah pulau, satu per komponen.Versi yang sekarang digunakan
MorphologicalComponents
untuk menemukan dan menentukan jumlah cluster yang ada di array - region1
yang berdekatan secara fisik. Karena grafik tidak diperlukan, ini menghasilkan ekonomi kode yang sangat besar.Kode
Contoh
5
Bagaimana itu bekerja
Data dimasukkan sebagai array; di Mathematica, ini adalah daftar daftar.
Dalam larik input, data dikonversi menjadi
1
dan0
oleh penggantiandi mana
/.
bentuk infixReplaceAll
diikuti oleh aturan penggantian. Ini pada dasarnya mengubah array menjadi gambar hitam dan putih. Yang perlu kita lakukan adalah menerapkan fungsiImage
,.Kotak putih sesuai dengan sel yang memiliki nilai, 1.
Gambar di bawah ini menunjukkan beberapa langkah yang digunakan pendekatan. Matriks input hanya berisi
1
'dan0
'. Matriks keluaran memberi label setiap gugus morfologis dengan angka. (Saya membungkus matriks input dan outputMatrixForm
untuk menyoroti struktur dua dimensi mereka.)MorphologicalComponents
menggantikan1
s dengan integer yang sesuai dengan nomor cluster setiap sel.Max
mengembalikan nomor cluster terbesar.Menampilkan Kepulauan
Colorize
akan mewarnai setiap pulau secara unik.sumber
MorphologicalComponents
menginginkanImage
, tetapi bahkan pada v9 tidak seharusnya demikianMax@MorphologicalComponents[d/.{"."->0,"*"->1}]
? Artinya, penggantian dilakukan terlebih dahulu?Max
akan hilang sebelum penggantian dilakukan, bukan?Max@MorphologicalComponents@d/.{"."->0,"*"->1}
itu tidak berfungsi, yang masuk akal adalahMax@MorphologicalComponents[d /. {"." -> 0, "*" -> 1}]
, sehingga Anda memiliki satu karakter lagi.Ruby 1.9 (
134121113110)Mengambil peta di stdin atau nama file peta sebagai argumen baris perintah pertama, dan mencetak jumlah pulau ke stdout. Menggunakan dasar banjir rekursif dasar. Perbaikan disambut seperti biasa!
Mirip dengan pewarnaan David, Anda juga bisa membuatnya untuk menampilkan berbagai pulau dengan mengubah
$_[i]=?.
ke$_[i]=c.to_s
danp c
keputs$_
, yang akan memberi Anda sesuatu seperti ini:(setidaknya sampai Anda kehabisan digit!)
Beberapa test case:
5
9
1
2
3
sumber
C, 169 karakter
Membaca peta dari stdin. Tidak beruntung meningkatkan fungsi pengisian banjir rekursif
r(j)
meskipun sepertinya bisa.sumber
Python 2,
223203 BytesTerima kasih untuk Langkah Hen dan Arnold Palmer karena telah menghilangkan 20 karakter spasi dan tanda kurung yang tidak perlu!
Saya pikir menggunakan daftar pemahaman dapat mengurangi jumlah byte, tetapi tidak memberikan peningkatan yang signifikan.
Coba di sini.
Saya terus mencoba memotongnya di sekitar daftar (tetangga), tetapi saya belum berhasil. Mungkin orang lain akan memiliki beberapa ide untuk bagian itu.
sumber
(s.index(l),i)
danfor
,enumerate(l)
danif
,-v[0])<2
danand
,p=0:
danp
, danbool(x&n[p])
danelse
. Anda juga memiliki lebih banyak tanda kurung daripada yang dibutuhkan dalam pernyataan cetak Anda, karena Anda memiliki 2 grup di sekitarnyaset
. Sunting: Mengalahkan oleh StepHen karena melakukan hal-hal di ponsel tidak ideal.Perl 5 , 100 byte
98 byte kode + 2 byte untuk
-p0
flag.Cobalah online!
Adaptasi (atau lebih tepatnya penyederhanaan) dari jawaban saya terhadap tantangan Berapa Banyak Lubang? . Anda dapat menemukan penjelasan tentang cara kode ini bekerja pada jawaban lain ini (agak lama untuk dijelaskan, jadi saya lebih suka untuk tidak mengetik ulang seluruh penjelasan).
sumber
Python 2, 233 byte
Terlalu lama, dibandingkan dengan jawaban lain. Port jawaban saya untuk pertanyaan ini .
Cobalah online
sumber
JavaScript, 158 byte
Jawaban ES6 yang tidak bersaing (tantangan tanggal akhir bahasa) untuk 132 byte:
Port jawaban saya untuk Berapa Banyak Lubang? (ya saya melompat pada kereta musik, sekarang saya telah melihat dua orang lain jawaban jawaban mereka).
sumber
Python 2 , 225 byte
Cobalah online!
sumber