해안선 찾기


14

당신의 임무는 ASCII지도에서 제공되는 섬지도의 해안선 길이를 찾는 것입니다. 입력지도는 #토지를 나타내는 하나 이상의 문자와 물을 나타내는 공백으로 구성됩니다. 해안선은 내륙 호수와 섬을 포함하여 육지와 물 사이의 경계로 간주됩니다.

솔루션은 파일, 문자열 또는 문자열 배열을 읽고 화면 또는 stdout에 단일 정수를 출력하는 완전한 프로그램이어야합니다. 각 입력 행에는 선행 또는 후행 공백과 0 개 이상의 해시 문자가있을 수 있습니다. 지도의 경계는 공간 (물) 인 것으로 가정합니다.

줄 길이가 다를 수 있습니다.

예 :

Input:
##
##
Output: 8

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

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

이것은 코드 골프이므로 가장 작은 바이트 수가 이깁니다.


입력이 공백이있는 사각형으로 채워져 있다고 가정 할 수 있습니까?
마틴 엔더

왜 완전한 프로그램입니까? 일반적으로 기능도 허용되며,이 도전이 제한적인 이유는 없습니다.
nimi

@ MartinBüttner, 그렇습니다. 나는 "지도의 경계가 공간 (물) 인 것으로 가정한다"는 것을 희망하고 있었다. 더 명확하게해야하는지 알려주세요.
논리 기사

@nimi, 귀하의 우려를 이해합니다. 그러나 12 시간이 지났기 때문에 4 가지 답변이 있으며 다른 사람들이 지금이 문제를 해결하고있을 수 있으므로 변경을 꺼려합니다.
논리 기사

@CarpetPython 아니오 입력의 모든 줄이 같은 길이라고 가정 할 수 있는지 여부를 의미합니다.
Martin Ender

답변:


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 바이트가 절약되었습니다.


stdout 또는 화면에 쓰는 완전한 프로그램이기 때문에 이것이 확실하지 않습니다. 이것과 별도로 : 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

MATL , 42 바이트

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

입력을 문자열 형식의 셀형 배열로 받아들입니다.

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

먼저 입력을 2D char 배열로 변환하고 공백으로 채운 다음 0과 1의 행렬로 변환합니다. 2D 컨벌루션은 두 개의 다른 마스크로 두 번 적용됩니다. 첫 번째는 매트릭스를 확장하기위한 것이고, 두 번째는 에지를 감지하기위한 것입니다.

온라인으로 사용해보십시오!


0

apt, 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.