Kıyı şeridini bulun


14

Göreviniz bir ASCII haritasında sağlanan bir ada haritasının kıyı şeridinin uzunluğunu bulmaktır. Giriş haritası, #araziyi ve suyu gösteren boşlukları gösteren 1 veya daha fazla karakterden oluşacaktır . Sahil şeridi, iç göller ve adalar dahil olmak üzere toprak ve su arasında herhangi bir kenar olarak kabul edilir.

Çözümünüz, bir dosya, dize veya bir dizi dizide okunan ve ekrana veya stdout'a tek bir tamsayı çıkaran eksiksiz bir program olmalıdır. Her giriş satırının başında veya sonunda boşluk ve sıfır veya daha fazla karma karakter olabilir. Haritanın sınırlarının boşluk (su) olduğu varsayılır.

Çizgiler farklı uzunluklarda olabilir.

Örnekler:

Input:
##
##
Output: 8

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

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

Bu kod golf, yani en küçük bayt sayısı kazanır.


Girişin boşluklu bir dikdörtgene doldurulduğunu varsayabilir miyiz?
Martin Ender

Neden tam bir program? Genellikle işlevlere de izin verilir ve bu zorluğun kısıtlayıcı olması için iyi bir neden göremiyorum.
nimi

@ MartinBüttner, evet. "Haritanın sınırlarının uzay (su) olduğu varsayılıyor" diye umuyordum. Bunu daha açık hale getirmem gerekirse bana bildirin.
Mantık Şövalyesi

@nimi, endişenizi anlıyorum, ancak zorluk 12 saat olduğu için 4 cevap var ve diğer insanlar şu anda üzerinde çalışıyor olabilir, değiştirmek istemiyorum.
Mantık Şövalyesi

@CarpetPython hayır Girişin tüm satırlarının aynı uzunlukta olduğunu varsayabilir miyiz demek istiyorum.
Martin Ender

Yanıtlar:


14

Salyangoz , 8 bayt

A
\#o!\#

ASeçenek bir eşleşme gelen başarılı başlangıç noktaları yerine tüm eşleşen yolları saymak anlamına gelir. \#a tüketir #, okardinal yöne döner ve önümüzde !\#bir yoksa başarılı olan negatif bir iddiadır #.


4

Pyth - 25 23 bayt

İlk olarak girişi bir rektife yerleştirir. Daha sonra " #", giriş + boşluğun 4 aktarım ve tersine çevrilmesinin üzerinde meydana gelen olayları sayar .

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

Burada çevrimiçi deneyin .


Bu, girdinin kenarındaki sahil şeritlerini nasıl tespit edebilir?
feersum

Önce onu doldurdum, söylemeyi unuttum.
Maltysen

3

ES6, 123 115 114 bayt

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

Düzenleme: @ edc65 sayesinde 9 bayt kaydedildi.


Bu arıya stdout'a veya ekrana yazan tam bir program olduğundan emin değilim. Bunun dışında: replace işlevinin parametresini kullanmalısınız. 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

Ve daha iyisia=>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, tabii ki, iç dizi değerini yakalamak zorunda kalarak iki bayt kaybettim. Ayrıca, bu replace parametresinde güzel bir yakalama.
Neil

2

MATL , 42 bayt

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

Bu, girdiyi formun hücre dizeleri dizisi olarak kabul eder

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

Öncelikle girişi bir 2D karakter dizisine dönüştürür, boşluklarla doldurur, sonra sıfır ve bir matrisine dönüştürür. 2D-konvolüsyon daha sonra iki farklı maske ile iki kez uygulanır: ilk önce matrisi genişletmek için, ikinci olarak kenarları tespit etmek için.

Çevrimiçi deneyin!


0

Japt, 22 19 bayt

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

Girdinin bir dikdörtgen oluşturmak için boşluklarla doldurulduğunu varsayar. Çevrimiçi test edin!

Nasıl çalışır

          // 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.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.