找到海岸线


14

您的任务是找到ASCII地图中提供的岛屿地图的海岸线长度。输入地图将由1个或多个#表示土地的字符以及一些表示水的空间组成。海岸线被认为是水陆之间的任何边缘,包括内陆湖泊和岛屿。

您的解决方案应该是一个完整的程序,该程序可以读取文件,字符串或字符串数​​组,并向屏幕或stdout输出单个整数。每条输入行可以具有前导或尾随空格,以及零个或多个散列字符。假定地图的边界是空间(水)。

线的长度可以不同。

例子:

Input:
##
##
Output: 8

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

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

这是代码高尔夫球,因此最小的字节数获胜。


我们可以假设输入被填充为带有空格的矩形吗?
Martin Ender

为什么需要完整的程序?通常也允许使用函数,并且我认为此挑战没有限制性的充分理由。
nimi

@MartinBüttner,是的。我希望“假设地图的边界是空间(水)”涵盖了这一点。让我知道是否应该澄清这一点。
逻辑骑士

@nimi,我了解您的担心,但是由于挑战已经12个小时了,所以有4个答案,而且其他人可能正在研究此问题,因此我不愿意进行更改。
逻辑骑士

@CarpetPython否我的意思是我们是否可以假设输入的所有行都具有相同的长度。
Martin Ender

Answers:


14

蜗牛,8字节

A
\#o!\#

A选项意味着对所有匹配路径进行计数,而不是计算匹配从哪个起点开始。\#消耗a #o在基本方向上转弯,并且!\#是一个否定性断言,如果#我们前面没有a ,则断言成功。



3

ES6,123个 115 114字节

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

编辑:由于@ edc65,节省了9个字节。


我不确定这是一个写到stdout或屏幕上的完整程序。除此之外:您应该使用replace函数的参数。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 '16

更好a=>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啊,当然,由于必须捕获内部数组值,我损失了两个字节。另外,很好地抓住那个replace参数。
尼尔,2016年

2

MATL42字节

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

这接受输入作为字符串的单元格数组,格式为

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

它首先将输入转换为2D char数组,并用空格填充,然后转换为零和一的矩阵。然后使用两个不同的蒙版两次应用2D卷积:第一个用于扩展矩阵,第二个用于检测边缘。

在线尝试!


0

Japt,22个 19字节

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

假定输入用空格填充以形成矩形。在线测试!

怎么运行的

          // 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.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.