Знайдіть берегову лінію


14

Ваше завдання - знайти довжину берегової лінії карти островів, поданої на карті ASCII. Вхідна карта буде складатися з 1 або більше #символів, які позначають землю, та пробілів, які позначають воду. Береговою лінією вважається будь-який край між сушею та водою, включаючи внутрішні озера та острови.

Вашим рішенням має бути повна програма, яка читає у файлі, рядку або масиві рядків і виводить одне ціле число на екран або stdout. Кожен рядок вводу може мати провідний або кінцевий простір та нуль або більше хеш-символів. Межі карти вважаються простором (водою).

Лінії можуть бути різної довжини.

Приклади:

Input:
##
##
Output: 8

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

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

Це кодовий гольф, тому виграє найменше число байтів.


Чи можна припустити, що вхід підкладений до прямокутника з пробілами?
Мартін Ендер

Чому повноцінна програма? Зазвичай функції також дозволені, і я не бачу вагомих причин, щоб цей виклик був обмежувальним.
німі

@ MartinBüttner, так. Я сподівався, що "Межі карти вважаються простором (водою)" охоплюють це. Дайте мені знати, чи варто робити це ясніше.
Логічний лицар

@nimi, я розумію ваше занепокоєння, але оскільки виклик становить 12 годин, є 4 відповіді, і інші люди можуть працювати над цим прямо зараз, я не хочу його змінювати.
Логічний лицар

@CarpetPython ні, я не маю на увазі, чи можна вважати, що всі рядки вводу мають однакову довжину.
Мартін Ендер

Відповіді:


14

Равлики , 8 байт

A
\#o!\#

Цей Aпараметр означає підрахувати всі відповідні шляхи, а не з яких початкових пунктів відповідає матч. \#споживає a #, oповертається в кардинальному напрямку і !\#є негативним твердженням, яке є успішним, якщо #перед нами немає.


4

Pyth - 25 23 байт

Спочатку він прокладає вхід до прямої. Потім підраховує виникнення " #"понад 4 перестановок транспозицій та перетворень вхідного + пробілу.

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

Спробуйте його онлайн тут .


Як це може виявити берегові лінії на межі входу?
feersum

Я проклав це спочатку, я забув це сказати.
Мальтісен

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

Редагувати: Збережено 9 байт завдяки @ edc65.


Я не впевнений, що в цій програмі є повна програма, яка пише в stdout або на екран. Крім цього: вам слід скористатися параметром функції заміни. 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

MATL , 42 байти

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

Це сприймає введення форми як масив рядків рядків форми

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

Він спочатку перетворює вхід у двовимірний масив знаків, прошиваючи пробілами, а потім у матрицю нулів та одиниць. Потім 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.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.