Temukan garis pantai

14

Tugas Anda adalah menemukan panjang garis pantai dari peta pulau yang disediakan dalam peta ASCII. Peta input akan terdiri dari 1 atau lebih #karakter yang menunjukkan tanah, dan spasi yang menunjukkan air. Garis pantai dianggap sebagai batas antara daratan dan air, termasuk danau dan pulau di daratan.

Solusi Anda harus berupa program lengkap yang membaca dalam file, string atau array string, dan menampilkan bilangan bulat tunggal ke layar atau stdout. Setiap jalur input mungkin memiliki ruang awal atau akhir, dan nol atau lebih karakter hash. Batas-batas peta diasumsikan sebagai ruang (air).

Garis mungkin memiliki panjang yang berbeda.

Contoh:

Input:
##
##
Output: 8

Input:
    ###    ###
  #####     #
   ##
Output: 26

Input:
  #####
  #   #
  # # #
  #   #
  #####
Output: 36

Ini adalah kode golf, sehingga jumlah byte terkecil menang.

Ksatria Logika
sumber
Bisakah kita berasumsi bahwa input diisi dengan persegi panjang dengan spasi?
Martin Ender
Mengapa program yang lengkap? Biasanya fungsi juga diperbolehkan, dan saya tidak melihat alasan yang bagus untuk tantangan ini menjadi terbatas.
nimi
@ MartinBüttner, ya. Saya berharap bahwa "Perbatasan peta diasumsikan ruang (air)" menutupi itu. Beri tahu saya jika saya harus membuatnya lebih jelas.
Logic Knight
@nimi, saya mengerti kekhawatiran Anda, tetapi karena tantangannya sudah berusia 12 jam, ada 4 jawaban, dan orang lain mungkin sedang mengerjakannya sekarang, saya enggan mengubahnya.
Logic Knight
@CarpetPython tidak, maksud saya apakah kita dapat berasumsi bahwa semua baris input memiliki panjang yang sama.
Martin Ender

Jawaban:

14

Siput , 8 byte

A
\#o!\#

The Apilihan berarti untuk menghitung semua jalur yang cocok bukan yang titik awal pertandingan berhasil dari. \#mengkonsumsi a #, oberputar dalam arah mata angin, dan !\#merupakan pernyataan negatif yang berhasil jika tidak ada #di depan kita.

feersum
sumber
4

Pyth - 25 23 byte

Pertama-tama input pad ke persegi. Kemudian menghitung kemunculan " #"lebih dari 4 permutasi transposisi dan pembalikan ruang input +.

/ssm_B++;j;d;CB.t.zd" #

Cobalah online di sini .

Maltysen
sumber
Bagaimana cara mendeteksi garis pantai di tepi input?
feersum
Saya pad dulu, saya lupa mengatakan itu.
Maltysen
3

ES6, 123 115 114 byte

a=>a.map((s,i)=>s.replace(/#/g,(h,j)=>r+=(s[j-1]!=h)+(s[j+1]!=h)+((a[i-1]||'')[j]!=h)+((a[i+1]||'')[j]!=h)),r=0)|r

Sunting: Disimpan 9 byte berkat @ edc65.

Neil
sumber
Saya tidak yakin tentang ini karena program lengkap yang menulis ke stdout atau di layar. Terlepas dari ini: Anda harus menggunakan param fungsi ganti. a=>['',...a,''].map((s,i,a)=>s.replace(/#/g,(_,j)=>r+=(s[j-1]!=_)+(s[j+1]!=_)+(a[i-1][j]!=_)+(a[i+1][j]!=_)),r=0)|r
edc65
Dan lebih baika=>a.map((s,i)=>s.replace(/#/g,(_,j)=>r+=(s[j-1]!=_)+(s[j+1]!=_)+((a[i-1]||'')[j]!=_)+((a[i+1]||'')[j]!=_)),r=0)|r
edc65
@ edc65 Ah, tentu saja, saya kehilangan dua byte karena harus menangkap nilai array internal. Juga, tangkapan bagus pada parameter ganti itu.
Neil
2

MATL , 42 byte

c2\FTFt!*Y+2*qFTFtl-4lhhbvv_2X53$Y+t0>)s2/

Ini menerima input sebagai larik sel string, dari formulir

{'#####', '#   #', '# # #', '#   #', '#####'}

Pertama-tama mengkonversi input ke array char 2D, padding dengan spasi, dan kemudian ke matriks nol dan satu. Konvolusi 2D kemudian diterapkan dua kali, dengan dua topeng yang berbeda: pertama untuk memperluas matriks, kedua untuk mendeteksi tepi.

Cobalah online!

Luis Mendo
sumber
0

Japt, 22 19 byte

4o £UzX è"#%s|#$} x

Mengasumsikan input diisi dengan spasi untuk membentuk persegi panjang. Uji secara online!

Bagaimana itu bekerja

          // Implicit: U = input string, S = a space
4o £    } // Create the array [0,1,2,3], and map each item X to:
UzX       //  Rotate U by 90 degrees X times.
è"#%s|#$  //  Count the number of "#"s followed by a space, newline, or end-of-string.
x         // Sum the resulting array.
Produksi ETH
sumber