海岸線を見つける


14

あなたの仕事は、ASCIIマップで提供される島の地図の海岸線の長さを見つけることです。入力マップは#、土地を示す1つ以上の文字と、水を示すスペースで構成されます。海岸線は、内陸の湖や島を含む、陸と水の間の端と見なされます。

ソリューションは、ファイル、文字列、または文字列の配列を読み込み、画面または標準出力に単一の整数を出力する完全なプログラムでなければなりません。各入力行には、先頭または末尾のスペース、およびゼロ個以上のハッシュ文字を含めることができます。マップの境界は、スペース(水)と見なされます。

行の長さは異なる場合があります。

例:

Input:
##
##
Output: 8

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

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

これはコードゴルフであるため、最小のバイトカウントが優先されます。


入力がスペースのある長方形に埋め込まれていると仮定できますか?
マーティンエンダー

完全なプログラムが必要な理由 通常、機能も許可されますが、このチャレンジが制限的である正当な理由はわかりません。
-nimi

@MartinBüttner、はい。「地図の境界が空間(水)であると想定される」がそれをカバーすることを望んでいました。それをもっと明確にする必要があるかどうかを教えてください。
ロジックナイト

@nimi、私はあなたの懸念を理解していますが、チャレンジは12時間前なので、4つの答えがあり、他の人が今それに取り組んでいるかもしれませんが、私はそれを変更したがりません。
ロジックナイト

@CarpetPython no入力のすべての行が同じ長さであると仮定できるかどうかを意味します。
マーティンエンダー

回答:


14

カタツムリ、8バイト

A
\#o!\#

Aオプションは、マッチが成功したから出発点ではなく、すべてのマッチングパスをカウントすることを意味します。\#消費#o基本的方向に回転し、!\#存在しない場合に成功し、負の主張である#私たちの目の前に。



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バイト保存されました。


私は、これが標準出力または画面上に書き込む完全なプログラムであることについては不確かです。これとは別に、replace関数のparamを使用する必要があります。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

そしてより良い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ああ、もちろん、内側の配列値をキャプチャする必要があるため、2バイトを失います。また、その置換パラメーターをうまくキャッチします。
ニール

2

MATL42バイト

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

これは、次の形式の文字列のセル配列として入力を受け入れます。

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

最初に入力を2D char配列に変換し、スペースを埋めてから、ゼロと1のマトリックスに変換します。2Dコンボリューションは、2つの異なるマスクを使用して2回適用されます。1つ目はマトリックスの拡張用、2つ目はエッジの検出用です。

オンラインでお試しください!


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.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.