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

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 .

feersum
источник
4

Pyth - 25 23 байта

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

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

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

Maltysen
источник
Как это может обнаружить береговые линии на краю входа?
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.
ETHproductions
источник