Найти береговую линию


14

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

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

Линии могут быть разной длины.

Примеры:

Input:
##
##
Output: 8

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

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

Это кодовый гольф, поэтому выигрывает наименьшее количество байтов.


Можем ли мы предположить, что ввод дополнен прямоугольником с пробелами?
Мартин Эндер

Почему полная программа? Обычно функции также разрешены, и я не вижу веских причин для того, чтобы этот вызов был ограничительным.
Ними

@ MartinBüttner, да. Я надеялся, что «Границы карты предполагаются как пространство (вода)» покрывали это. Дайте мне знать, если я должен сделать это яснее.
Рыцарь логики

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

@CarpetPython нет Я имею в виду, можем ли мы предположить, что все строки ввода имеют одинаковую длину.
Мартин Эндер

Ответы:


14

Улитки , 8 байт

A
\#o!\#

AПараметр означает рассчитывать все пути , а совпадающие точки , которые , начиная матч завершается успешно с. \#потребляет a #, oповорачивается в кардинальном направлении и !\#является отрицательным утверждением, которое успешно выполняется, если #перед нами нет a .


4

Pyth - 25 23 байта

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

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

Попробуйте это онлайн здесь .


Как это может обнаружить береговые линии на краю входа?
feersum

Я набил это первым, я забыл это сказать.
Maltysen

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.


Я не уверен, что это полная программа, которая пишет на стандартный вывод или на экран. Помимо этого: вы должны использовать параметр функции замены. 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/

Это принимает входные данные в виде массива ячеек в форме

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

Сначала он преобразует входные данные в двумерный массив символов, дополняемый пробелами, а затем в матрицу нулей и единиц. Затем двумерную свертку применяют дважды с двумя разными масками: сначала для расширения матрицы, затем для обнаружения ребер.

Попробуйте онлайн!


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.